【问题标题】:Dynamic Lambda with all properties of a property of an object具有对象属性的所有属性的动态 Lambda
【发布时间】:2010-11-16 14:20:24
【问题描述】:

我问了一个关于如何使用对象的所有属性动态编译 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 Delegate 适用于另一种类型,例如Func&lt;ABCMyEntity,bool&gt; 而 MyEntity 是此对象 (ABCMyEntity.MyEntity) 的成员。传递的 Propertyinfo 对象是 MyEntity 的成员。

我知道这听起来很令人困惑,但我无法更好地解释它。 (也许是因为我不是母语人士)。请问我问题中是否有不清楚的地方。

Constructing Dynamic LINQ queries with all properties of an object继续

【问题讨论】:

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


    【解决方案1】:

    如果您需要访问一系列属性(例如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 的部分转换为循环 - 您只需遍历所需属性的列表并使用 Expression.Property 添加对表达式的属性访问.

    【讨论】:

    • 谢谢 Tomas,我现在就试试这个!!
    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多