从list中创建一个lambda表达式,其中每个项都是OR'

本文关键字:OR 表达式 创建 list lambda 一个 | 更新日期: 2023-09-27 18:11:10

我不确定这是否可能,但以下代码可以工作:

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]);

是否可以选择每个项目并以某种方式或它?

从list中创建一个lambda表达式,其中每个项都是OR'

那么,一个智能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;
  }
}

感谢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;
  }
}