如何使用多个二进制表达式条件和包含条件创建动态 LINQ 表达式

Posted

技术标签:

【中文标题】如何使用多个二进制表达式条件和包含条件创建动态 LINQ 表达式【英文标题】:How to create dynamic LINQ Expression with multiple binary expression conditions and a contains condition 【发布时间】:2021-11-04 15:01:31 【问题描述】:

我想为这种查询创建一个动态 LINQ 表达式

people.Where(x => x.Name="Some_Name" && x.Age>60 && x.ChildIds.Contains("Some_Id"));

我已经做的是填充我的List<BinaryExpression>List<BinaryExpression> 包含 x.Name="Some_Name"x.Age>60

我现在的问题是x.ChildIds.Contains("Some_Id")。我一直在寻找一种动态创建Contains 表达式的方法,这就是我得到的:

Expression.Call(memberExpression, "Contains", null, constantExpression)

但这会返回一个MethodCallExpression,我无法附加到我的List<BinaryExpression>

我想将contains 表达式附加到BinaryExpression 的原因是因为这就是我执行LINQ 的&& 部分的方式

var aggregatedExpressions = binaryExpressions.Aggregate((x, y) => Expression.AndAlso(x, y));

如果我无法将 Contains 表达式附加到二进制表达式中,我如何将 Contains MethodCallExpression 聚合到我的 aggregatedExpressions 中以便以这种方式编写?

x.Name="Some_Name" && x.Age>60 && x.ChildIds.Contains("Some_Id")

【问题讨论】:

您可以将List<BinaryExpression> 更改为List<Expression>,因为BinaryExpression 只是可以聚合的布尔表达式的子集。 【参考方案1】:

我现在关闭它。我已经弄清楚如何聚合MethodCallExpressions

aggregatedExpressions = Expression.AndAlso(aggregatedExpressions, methodCallExpression);

【讨论】:

以上是关于如何使用多个二进制表达式条件和包含条件创建动态 LINQ 表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何构建具有多个条件的 Lambda 表达式树

在 s-s-rS 中,如何使用多值参数创建动态“位置”条件

项目参考条件包含多个条件

Lambda表达式动态组装查询条件

闪亮的动态/条件过滤选择多个输入(selectizeInput,多个= TRUE)

动态创建匿名对象利用表达式树动态构建分组条件