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

C# 从列表中创建lambda表达式,其中每个项都是OR,c#,lambda,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 th

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

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

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

好的,智能LINQ提供程序将能够直接使用阵列,如下所示:

searchDescriptor.Query(q => myOrQueries.Any())
如果这还不够好,您只需使用OrElse将这些查询组合在一起,并在原始searchDescriptor的Where中将它们用作单个谓词

这有点长,所以我只让您参考Joe Albahari的PredicateBuilder助手类:

在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是一个不可能的方法,但它是一个构建表达式的简单方法:

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

你是说它吗?不,我不这么认为。我需要能够执行以下操作:q=>myorquerys.ForEach | |或类似操作。基本上是对列表进行OR'ing。Any将只检查列表中是否有内容,假设每个项目都是实际查询,则可能需要执行它们,例如Anyx=>x.searchDescriptor.Queryq=>myOrQueries。只要myOrQueries至少查询一个元素,Any将匹配每个项目。应该是searchDescriptor.Queryq=>myOrQueries.Anyx=>xqWell,我不知道这些查询是什么,所以我无法编写完全正确的代码,我只是概述一下原因。很可能像searchDescriptor.Queryq=>possibleValues.Containsq.SomeField这样的东西会更适合。@Luaan我认为问题是你建议任何东西都应该起作用,而实际上任何东西都只是确定列表中有东西,它绝对不会计算列表中某个特定项的值,而这正是OP所寻找的。Any不是我所寻找的。请参阅我的第一行,它可以工作-我需要使用列表获得相同的输出。我会试试PredicateBuilder,然后告诉你。谢谢