我有一个集合,我想在其中以编程方式将 OR 条件添加到 linq 查询。我知道如何添加如下所示的 AND 条件:
var mySet = SomeFactory.GetData();
foreach(var nameFilter in nameFilters)
{
mySet = mySet.Where(item => item.Name == nameFilter);
}
foreach(var ageFilter in ageFilters)
{
mySet = mySet.Where(item => item.Age == ageFilter)
}
但是,如果我希望这些是 OR 条件而不是“AND”在一起,我该怎么做? IE。如果我知道我将始终拥有这两个值而不是不同值的数组,我就可以做到这一点:
mySet.Where(item => item.Name == nameFilter[0] || item.Name == nameFilter[1] ... || item.Age == ageFilter[0] || item.Age == ageFilter[1] || ...);
TL;DR:我希望能够将未知数量的 bool 检查链接到使用 OR 语句评估的单个表达式中。例如,如果我有一个名为 Mary 或 Jim 的人的交叉引用,他们是 32 岁或 51 岁。
最佳答案
PredicateBuilder
将帮助您灵活地应用 where 子句。您可以找到扩展方法 here .
var filterOfNames = new List<string> {"Sample", "Sample2"};
var filterOfAges = new List<int> { 21, 33, 45 };
var mySet = SomeFactory.GetData();
var predicate = PredicateBuilder.True<TypeOfmySet>();
foreach (var filterOfName in filterOfNames)
{
//If it is the first predicate, you should apply "And"
if (predicate.Body.NodeType == ExpressionType.Constant)
{
predicate = predicate.And(x => x.Name == filterOfName);
continue;
}
predicate = predicate.Or(x => x.Name == filterOfName);
}
foreach (var filterOfAge in filterOfAges)
{
//If it is the first predicate, you should apply "And"
if (predicate.Body.NodeType == ExpressionType.Constant)
{
predicate = predicate.And(x => x.Age == filterOfAge);
continue;
}
predicate = predicate.Or(x => x.Age == filterOfAge);
}
//I don't know the myset has which type in IQueryable or already retrieved in memory collection. If it is IQueryable, don't compile the predicate otherwise compile it.
//var compiledPredicate = predicate.Compile();
mySet = mySet.Where(predicate);
关于c# - 动态添加 Or 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466481/