2010-11-16 54 views
0

我曾問如何動態編譯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

繼續。如果您需要訪問的屬性(如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即可添加對錶達式的屬性訪問權限。

+0

謝謝Tomas,我現在就試試吧! – ganeshran 2010-11-16 15:02:49