从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]);
是否可以选择每个项目并以某种方式或它?
那么,一个智能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;
}
}