0

次のようなものが必要です: Select name from users where id = 1 or id = 2. 私はこれを行うことができることを知っています:

_db.Users
.Where(u => u.Id == 1 || u.Id == 2);

しかし、これに代わるものはありますか?このようなものはありますか:

_db.User
.Where(u => u.Id == 1)
.Or
.Where(u => u.Id == 2)
4

3 に答える 3

2

私は通常、次のフォームを使用して、ORとANDを使用して動的なlinqを構築します。

public class Linq
{
 public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1,
                                                        Expression<Func<T, bool>> expression2)
{
        if (expression1 == null) throw new ArgumentNullException("expression1", "Consider setting expression1 to Linq.True<T>() or Linq.False<T>()");
        var invokedExpr = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse(expression1.Body, invokedExpr), expression1.Parameters);
}


public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
                                                         Expression<Func<T, bool>> expression2)
    {
        if (expression1 == null) throw new ArgumentNullException("expression1", "Consider setting expression1 to Linq.True<T>() or Linq.False<T>()");
        var invokedExpr = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>
              (Expression.AndAlso(expression1.Body, invokedExpr), expression1.Parameters);
    }

public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }
}

そして、それをコードで使用します。

Expression<Func<User, bool>> searchExpression = Linq.False<User>();

searchExpression = Linq.Or<User>(searchExpression, b => b.Id==1);
searchExpression = Linq.Or<User>(searchExpression, b => b.Id==2);

次に、このsearchExpressionを次のように使用します

_db.Users.Where(searchExpression);

このフォームを使用すると、次のような動的クエリを簡単に作成できます。

Expression<Func<User, bool>> searchExpression = Linq.False<User>();
searchExpression = Linq.Or<User>(searchExpression, b => b.Id==1);
if (!String.IsNullOrEmpty(name))
    searchExpression = Linq.Or<User>(searchExpression, b => b.Name.StartsWith(name));
//combine with OR / AND as much as you need

DBへのクエリは1つだけ生成されます。

于 2012-11-24T18:23:11.570 に答える
2

直接ではありません。_db.Users.Where(u => u.Id == 1)は ID が 1 のユーザーであることを思い出してください。IDが 2 のユーザーは存在しないため、そこから取得することはできません。

次のような他のアプローチを使用できます。

var user1 = _db.Users.Where(u => u.Id == 1);
var user2 = _db.Users.Where(u => u.Id == 2);
var users = user1.Union(user2);

また

var userids = new int[] { 1, 2 };
var users = _db.Users.Where(u => userids.Contains(u.Id));

けれど。

于 2012-11-24T18:20:51.947 に答える
0

あなたはただ欲しい:

_db.Users.Where(u => (u.Id == 1 || u.Id == 2));
于 2012-11-25T21:53:18.563 に答える