使用OR将多个if条件合并到单个LINQ语句中

时间:2011-11-23 16:04:36

标签: c# linq

  

可能重复:
  Linq: “Or” equivalent of Where()

我在大约一周前发布了一个question,其中根据我的参数中是否包含值来附加到LINQ查询的解决方案如下所示:

var query = Database.Set<User>();

if (condition1.HasValue)
{
    query = query.Where(x => x.Condition1 == condition1.Value);
}
if (condition2.HasValue)
{
    query = query.Where(x => x.Condition2 == condition2.Value);
}
...
return query.ToList();

此代码将使用AND附加到WHERE子句。我将如何使用OR来附加到WHERE子句?

5 个答案:

答案 0 :(得分:4)

您需要使用谓词构建器here is an example

答案 1 :(得分:2)

您可以尝试使用PredicateBuilder库。这是一个示例:

var predicate = PredicateBuilder.False<User>();
if (condition1.HasValue)
{
  predicate = predicate.Or(x => x.Condition1 == condition1.Value);
}
if (condition2.HasValue)
{
  predicate = predicate.Or(x => x.Condition2 == condition2.Value);
}
return Database.Set<User>().Where(predicate);

答案 2 :(得分:1)

这可以解决问题,作为PredicateBuilder的替代方案。

var query = Database.Set<User>();             
var query2 = query.Where(x => (condition1.HasValue && x.Condition1 == condition1.Value) || (condition2.HasValue && x.Condition2 == condition2.Value));

答案 3 :(得分:0)

您必须自己创建表达式树。或者另一方面,您可以使用Dynamic LINQ并构造LINQ问题字符串并执行它。 查看System.Linq.Expression名称或System.Linq.Dynamic

答案 4 :(得分:0)

你做不到。说明:

var iS = {1,2,3,4,5};
var iEvens = iS.Where(x => x % 2 == 0);
var iEvensAddOr = iEvens.OrWhere(x => x % 2 == 1);

您希望拥有iS.Where(x => x % 2 == 0 || x % 2 == 1),但您已使用第一个Where()过滤了您的列表。你想要的是撤消过滤器并创建一个新过滤器。但是你已经过滤了,为时已晚。

你可以使用联盟,但这并不是你想要的。