手动为x =>构建linq表达式. x.Child == itemToCompare.Child [英] manually build linq expression for x => x.Child == itemToCompare.Child
问题描述
我们有一个对象,我们想基于该对象动态构建一个linq查询.此linq语句等效于我们要构建的语句:
We have an object and we want to build a linq query based on that object on the fly. This linq statement is equivalent to what we want to build:
Expression<Func<Sample, bool>> linqExpression
= x => x.Child == itemToCompare.Child;
我们还不太想出正确的表达式来构建itemToCompare.Child部分.到目前为止,这是我们所拥有的:
We can't quite come up with the right expression to build the itemToCompare.Child part. Here's what we have so far:
var param = Expression.Parameter(typeof(T), "x");
var key = itemToCompare.GetType().GetProperty("Child");
var rhsConstant = Expression.Constant(item);
var innerLambda = Expression.Lambda<Func<T>>(rhsConstant,
new ParameterExpression[0]);
var rhsMemberAccess = Expression.MakeMemberAccess(innerLambda, key);
body = Expression.Equal(lhsPropertyAccess, rhsMemberAccess);
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
我们手工构建的查询的表达式树如下:
The expression tree for our hand-built query looks like:
Lambda Expression: x => (x.Child = value(SampleTests+Sample))
Expression Body: (x.Child = value(SampleTests+Sample))
Parameter 0: 'x', Type: Sample
NodeType: Lambda
Left Lambda Expression: x.Child
Left NodeType: MemberAccess
Lambda Expression: x
Expression Member: Sample Child
NodeType: Parameter
-- a parameter expression
Right Lambda Expression: value(SampleTests+Sample)
Right NodeType: Constant
NodeType: Constant
Value: SampleTests+Sample
实际lambda的表达式树如下:
The expression tree for the actual lambda looks like:
Lambda Expression: x => (x.Child = value(SampleTests+<>c__DisplayClass15).itemToCompare.Child)
Expression Body: (x.Child = value(SampleTests+<>c__DisplayClass15).itemToCompare.Child)
Parameter 0: 'x', Type: Sample
NodeType: Lambda
Left Lambda Expression: x.Child
Left NodeType: MemberAccess
Lambda Expression: x
Expression Member: Sample Child
NodeType: Parameter
-- a parameter expression
Right Lambda Expression: value(SampleTests+<>c__DisplayClass15).itemToCompare.Child
Right NodeType: MemberAccess
Lambda Expression: value(SampleTests+<>c__DisplayClass15).itemToCompare
Expression Member: Sample Child
NodeType: MemberAccess
Lambda Expression: value(SampleTests+<>c__DisplayClass15)
Expression Member: Sample itemToCompare
NodeType: Constant
NodeType: Constant
Value: SampleTests+<>c__DisplayClass15
我们认为这可以解决
Expression<Func<Sample, bool>> linqExpression
= x => x.Child == (()=>itemToCompare).Child;
这就是我们试图在表达式中复制的内容.
which is what we're trying to reproduce in our expression.
最终目标是生成一个表达式,在该表达式中,使用子类型的.Equals()方法比较子值.
Ultimately the goal is to produce an Expression where the Child values are compared using their Type's .Equals() method.
谢谢!
推荐答案
您对内部lambda"感到困惑.只有一个lambda表达式:
You're getting confused by the "inner lambda". There's only one lambda expression:
var param = Expression.Parameter(typeof(Sample), "x");
var key = itemToCompare.GetType().GetProperty("Child");
var rhs = Expression.MakeMemberAccess(Expression.Constant(itemToCompare), key);
var lhs = Expression.MakeMemberAccess(param, key);
var body = Expression.Equal(lhs, rhs);
var lambda = Expression.Lambda<Func<Sample, bool>>(body, param);
这篇关于手动为x =>构建linq表达式. x.Child == itemToCompare.Child的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!