2012-11-24 66 views
0

我需要這樣的:Select name from users where id = 1 or id = 2。 我知道我可以做到這一點:如何在Where子句中使用'Or'?

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

但是有沒有其他辦法呢? 是否有這樣的事情:

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

回答

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)); 

雖然。

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生成一個查詢。

+0

遺憾的是它不工作,但它是一個偉大的想法。 – MuriloKunze

+0

它確實工作。我在我的項目中使用它。你遇到什麼問題? –

+0

查詢的結果視圖是「LINQ to Entities不支持LINQ表達式節點類型Invoke」。 – MuriloKunze

0

你只是想:

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