c# - 动态添加 Or 条件

标签 c# linq .net-4.6

我有一个集合,我想在其中以编程方式将 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/

相关文章:

c# - 将 IQueryable<EntityObject> 转换为 IQueryable<Specific>

c# - 在 C# 中调用多个 "SQL DataReader"的正确方法是什么?

ASP.NET 中间件不再保留文化

c# - 为什么 Microsoft 语音识别系统会匹配语法,即使没有说出该语法的单词?

c# - 如何反转查询或c#中的单词顺序

C# - 使用反射比较两个 .net dll

c# - 为什么 Visual Studio 将新创建的数组键入为可空?

linq - 拦截所有 EF6 Linq 查询

c# - Entity Framework - 无法创建类型的常量值

c# - CodeCop 和 .NET 4.6 - 为什么它无法运行?