2015-06-20 73 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);