动态Lambda,具有对象属性的所有属性

时间:2010-11-16 14:20:25

标签: c# .net linq reflection linq-to-entities

我问了一个关于如何使用对象的所有属性动态编译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

1 个答案:

答案 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}}。