48 votes

Expression.Lambda et génération de requêtes au moment de l'exécution, exemple le plus simple "Where" (où)

J'ai essayé de générer une expression lambda simple au moment de l'exécution, sans succès... quelque chose comme ceci :

var result = queryableData.Where(item => item.Name == "Soap")

Voici ma classe d'exemple et un fixture queryable :

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}

IQueryable<Item> queryableData = ...;

Ensuite, je génère une expression lambda au moment de l'exécution. Le code correct est le suivant :

//"item" in "item =>..."
var item = Expression
    .Parameter(typeof(Item), "item");

//property of my item, this is "item.Name"
var prop = Expression
    .Property(item, "Name");

//then "Soap" in '... => item.Name=="Soap"'
var value = Expression.Constant("Soap");

//equality expression "==" in my primer
var equals = Expression.Equal(prop, value);

//then lambda
var lambda = Expression.Lambda<Func<Item, bool>>(equals, item);

//and here are the results    
var results = queryableData.Where(lambda);

Un grand merci à dtb pour des conseils !

135voto

dtb Points 104373

Dans la requête suivante

var result = query.Where(item => item.Name == "Soap")

l'expression lambda est

item => item.Name == "Soap"

Vous devez seulement construire cette partie, et non l'appel Where qui accepte un arbre d'expression.

L'arbre d'expression pour l'expression lambda ressemble à ceci :

                     Lambda
                      /  \
                   Equal  Parameter
                   /   \    item
              Property  \
               "Name"   Constant
                 |       "Soap"
             Parameter         
               item

En code :

var item = Expression.Parameter(typeof(Item), "item");

var prop = Expression.Property(item, "Name");

var soap = Expression.Constant("Soap");

var equal = Expression.Equal(prop, soap);

var lambda = Expression.Lambda<Func<Item, bool>>(equal, item);

var result = queryableData.Where(lambda);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X