从列表创建lambda表达式,其中每个项目都是OR

时间:2014-07-02 08:17:37

标签: c# lambda

我不确定这是否可行,但以下代码有效:

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?

2 个答案:

答案 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;
  }
}