Pit*_*ing 4 c# linq lambda linq-expressions
我想动态生成一个linq.expressions.expression语句,我可以将其用作过滤器.
这是一个示例Linq查询,我想将其转换为Expression:
ctx.customer.where(c=>ctx.Invoice.Any(i=>i.customerId == c.id));
Run Code Online (Sandbox Code Playgroud)
这是我的尝试
using System.Linq.Expressions;
var c = Expression.parameter(typeof(Customer),"c");
var i = Expression.parameter(typeof(Invoice),"i");
var rightPart= Expression.Equal(
Expression.propertyorField(i,"customerId"), Expression.propertyorfield(c,"id")
Run Code Online (Sandbox Code Playgroud)
请协助.
当我需要手动创建linq表达式时,我只是让.Net为我创建来自lambda的表达式然后我可以探索它的结构.例如,在debug下运行
Expression<Func<TestObject, bool>> expression = t => t.Invoice.Any(i => i.CustomerId == t.Id);
Run Code Online (Sandbox Code Playgroud)
并检查表达式变量.
我认为它LinqExpression
来自using LinqExpression = System.Linq.Expressions.Expression;
.
没有特定的表达类型Any
,因为它不是运算符等. Any
是一个静态方法,所以你应该Call
为它创建一个表达式.
您需要基于静态方法语法而不是扩展方法语法来构建表达式:
ctx.customer.Where(c => Enumerable.Any(ctx.Invoice, i => i.customerId == c.id));
Run Code Online (Sandbox Code Playgroud)
这有很多步骤.这是大纲,因为我没有时间正确地完成所有步骤.我不完全确定如何表示c
内部lambda中使用的参数不是该lambda的参数,而是外部lambda的参数.概括地说,你需要
Enumerable.Any
方法的正确重载.MakeGenericMethod
).ctx.Invoce
)rightPart
在示例代码中).var innerLambda = Expression.Lambda(rightPart, i);
)Where
(即,Expression.Lambda(methodCallExpression, c)
.如果要组合注释中指示的布尔表达式,第四步将有所不同.
我希望有所帮助.