2015-06-20 75 views
0

我使用實體框架5,我有一個動態LINQ查詢。但我需要我必須連接兩個條件與「或」運算符。例如,我可以在普通的SQL文本中使用這個。多個動態條件或運算符

SELECT * FROM Products WHERE 
(Keywords LIKE '%keyw1%' AND Keywords LIKE '%keyw2%') OR (ProdName LIKE '%ProdName%') 

我在下面的linq查詢。但我需要動態地創建條件。 我該怎麼做?

var prodQuery = from p in _db.Products 
    select p; 

searchText.Split(' ') 
    .ForEach(
     s => 
      prodQuery = 
       prodQuery.Where(
        p => p.Product.Keywords.Contains(s))); 

//i need here "OR" operator. I have to connect this line with "OR" to upper condition 
prodQuery = prodQuery.Where(p => p.ProdName.Contains("test prod")) 
+0

和一般,搜索'PredicateBuilder'和'或' – xanatos

回答

0

你有沒有嘗試過這樣的:

searchText.Split(' ') 
    .ForEach(s => prodQuery = prodQuery 
     .Where(p => p.Product.Keywords.Contains(s)) || p.ProdName.Contains("test prod") 
    ); 

繼承人它的清潔版本,應該爲你工作:

string[] searchTerms = searchText.Split(' '); 
var prodQuery = _db.Products.Any(p => 
    p.Product.Keywords.Any(k => searchTerms.Contains(k)) 
    || searchTerms.Contains(p.ProdName) 
); 
0

你應該做的是建立查詢條件一個表達式樹,然後將它應用到你的linq對象。

您可以使用此PredicateBuilder類來執行此操作。

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

    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) 
    { 
     var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); 
     return Expression.Lambda<Func<T, bool>> 
      (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters); 
    } 

    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) 
    { 
     var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); 
     return Expression.Lambda<Func<T, bool>> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters); 
    } 
} 

,現在你的代碼:

var prodQuery = from p in _db.Products 
    select p; 

var condition = PredicateBuilder.False<Product>(); 

searchText.Split(' ') 
    .ForEach(s => condition = condition.And(p => p.Product.Keywords.Contains(s))); 

condition = condition.Or(p => p.ProdName.Contains("test prod")); 
prodQuery = prodQuery.Where(condition);