我问了一个关于如何使用对象的所有属性动态编译LINQ查询的问题,而houlgap已经足够给我以下代码了
private static Func<MyEntity, bool> GenerateLambda(MyEntity _myEntity, PropertyInfo propertyInfo)
{
var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
var property = Expression.Property(instance, propertyInfo);
var propertyValue = Expression.Constant(propertyInfo.GetValue(_myEntity, null));
var equalityCheck = Expression.Equal(property, propertyValue);
return Expression.Lambda<Func<MyEntity, bool>>(equalityCheck, instance).Compile();
}
如果要查询的属性直接是对象的成员,那么这很有用,但对我来说,中间有一个中间属性。对于例如Func委托代表另一种类型,例如: Func <ABCMyEntity,bool>
,而MyEntity是此对象的成员(ABCMyEntity.MyEntity)。传递的Propertyinfo对象是MyEntity的成员。
我知道这听起来非常令人困惑,但我无法更好地解释它。 (也许是因为我不是母语人士)。如果问题不明确,请问我。
继续Constructing Dynamic LINQ queries with all properties of an object
答案 0 :(得分:0)
如果您需要访问一系列属性(例如v.MyEntity.OtherProperty
),那么您可以多次致电Expression.Property
:
var prop1 = // first property
var prop2 = // second property
// Variable has type of the declarating type of the 1st property
var instance = Expression.Parameter(prop1.DeclaringType, "i");
// Get first property on the 'instance'
var expr1 = Expression.Property(instance, prop1);
// Get second property on the previous expression
var expr2 = Expression.Property(expr, prop2);
// The rest of the code stays the same (only use 'expr2')
var propertyValue = Expression.Constant(propertyInfo.GetValue(_myEntity, null));
var equalityCheck = Expression.Equal(expr2, propertyValue);
return Expression.Lambda<Func<MyEntity, bool>>
(equalityCheck, instance).Compile();
如果您需要访问的不仅仅是两个属性,您可以轻松地将调用Expression.Property
的部分转换为循环 - 您只需迭代所需属性列表并使用{添加对表达式的属性访问权限{1}}。