我不确定这是否可行,但以下代码有效:
searchDescriptor.Query(q => firstQuery || secondQuery || thirdQuery);
但我将这些从myOrQueries列表传递到我的方法中,所以我需要做类似的事情:
List<Query> myOrQueries; // includes the 3 items above
// what I need is the correct way of doing the line below - if possible??
searchDescriptor.Query(q => myOrQueries[0] || myOrQueries[1] || myOrQueries[2]);
是否可以选择每个项目并以某种方式进行OR?
答案 0 :(得分:1)
嗯,聪明的LINQ提供商将能够直接使用数组,如下所示:
searchDescriptor.Query(q => myOrQueries.Any())
如果这还不够好,您只需使用OrElse
将这些查询一起拍打,并将它们用作原始searchDescriptor上Where
中的单个谓词。
这有点冗长,所以我只想推荐给Joe Albahari的PredicateBuilder
帮助班:http://www.albahari.com/nutshell/predicatebuilder.aspx
有助于在IQueryable
上添加这些扩展方法,它们非常方便:)
修改强>:
一个有效的简单解决方案:
BaseQuery variableQuery = null;
if (roleStatuses != null && roleStatuses.Any())
{
foreach (string roleStatus in roleStatuses)
{
var status = roleStatus;
var subQuery =
new QueryDescriptor<MySearchDataContract>()
.Match(s => s.OnField(o => o.Roles.First().RoleStatus)
.QueryString(status));
variableQuery = variableQuery == null ? subQuery : variableQuery || subQuery;
}
}
答案 1 :(得分:0)
感谢Luaan的评论 - lambda是一个禁忌但是构建表达式的简单foreach:
BaseQuery variableQuery = null;
if (roleStatuses != null && roleStatuses.Any())
{
foreach (string roleStatus in roleStatuses)
{
var status = roleStatus;
var subQuery = new QueryDescriptor<MySearchDataContract>()
.Match(s => s.OnField(o => o.Roles.First().RoleStatus)
.QueryString(status));
variableQuery = variableQuery == null ? subQuery : variableQuery || subQuery;
}
}