在用 OR 连接的 where 子句中使用动态谓词的 linq 查询

Pat*_*oco 6 linq lambda expression

如果向当前查询添加更多限制,则可以在 c# 中轻松创建动态查询。

var list = new List<Item>();
var q = list.AsQueryable();
q = q.Where(x => x.Size == 3);
q = q.Where(x => x.Color == "blue");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,每个新谓词都被添加,并与前一个谓词执行 AND 运算。之前的结果等价于:

q = list.Where(x => x.Size == 3 && x.Color == "blue");
Run Code Online (Sandbox Code Playgroud)

是否有可能达到相同的结果但使用 OR 而不是 AND ?

q = list.Where(x => x.Size == 3 || x.Color == "blue");
Run Code Online (Sandbox Code Playgroud)

这个想法是有可变数量的表达式与 OR 运算符连接。

预期的结果需要以类似于以下伪代码的方式编写:

var conditions = new List<Func<Item, bool>>();
Run Code Online (Sandbox Code Playgroud)

然后迭代条件来构建类似的东西:

foreach(var condition in conditions)
    finalExpression += finalExpression || condition;
Run Code Online (Sandbox Code Playgroud)

Pat*_*oco 3

感谢 Rapha\xc3\xabl Althaus 提供了以下链接:

\n\n

http://www.albahari.com/nutshell/predicatebuilder.aspx

\n\n

谓词构建器就是解决方案。您可以使用它从 Nuget 安装 LinqKit。在该 url 中您还可以找到此类的实现。

\n\n

注意:为了使此功能与 LinqToSql 或 LinqToEntities 一起使用,必须使用“AsExpandable()”方法转换 IQueriable 对象,对于内存对象则不需要

\n