2010-11-16 19 views
0

j'avais posé une question sur la façon de compiler dynamiquement une requête LINQ avec toutes les propriétés d'un objet et houlgap avait été assez aimable pour me donner le code suivantLambda dynamique avec toutes les propriétés d'une propriété d'un objet

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(); 
} 

Cela fonctionne très bien si la propriété à interroger est directement un membre de l'objet mais pour moi il y a une propriété intermédiaire entre les deux. Par exemple Le délégué Func est pour un autre type, par ex. Func <ABCMyEntity,bool> alors que MyEntity est membre de cet objet (ABCMyEntity.MyEntity). L'objet Propertyinfo transmis est membre de MyEntity. Je sais que cela semble terriblement confus mais je ne suis pas en mesure de mieux l'expliquer. (Peut-être parce que je ne suis pas un locuteur natif). Veuillez me demander si quelque chose n'est pas clair dans la question.

Il se poursuit de Constructing Dynamic LINQ queries with all properties of an object

Répondre

0

Si vous avez besoin d'accéder à une chaîne de propriétés (par exemple v.MyEntity.OtherProperty), alors vous pouvez simplement appeler Expression.Property plusieurs fois:

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(); 

Si vous avez besoin d'accéder à plus que deux propriétés, vous pouvez facilement transformer la partie qui appelle Expression.Property en une boucle - vous pouvez simplement itérer sur une liste de propriétés souhaitées et ajouter l'accès de propriété à l'expression en utilisant Expression.Property.

+0

Merci Tomas, je vais essayer ça maintenant !! – ganeshran