如何使用多个二进制表达式条件和包含条件创建动态 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 表达式的主要内容,如果未能解决你的问题,请参考以下文章