我在大约一周前发布了一个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子句?
答案 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()
过滤了您的列表。你想要的是撤消过滤器并创建一个新过滤器。但是你已经过滤了,为时已晚。
你可以使用联盟,但这并不是你想要的。