Ausdruck.Lambda und Query Generation zur Laufzeit, einfachste "Wo" Beispiel

.net c# dynamic-language-runtime expression-trees lambda

Frage

Ich habe versucht, einen einfachen Lambda-Ausdruck zur Laufzeit ohne Glück zu erzeugen ... etwas in der Art:

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

Hier ist meine Beispielklasse und ein Fixture abfragbar:

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

IQueryable<Item> queryableData = ...;

Dann erzeuge ich einen Lambda-Ausdruck, zur Laufzeit folgt korrekter Code :

//"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);

Vielen Dank an dtb für Ratschläge!

Akzeptierte Antwort

In der folgenden Abfrage

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

der Lambda-Ausdruck ist

item => item.Name == "Soap"

Sie müssen nur diesen Teil konstruieren, nicht den Where-Aufruf, der einen Ausdrucksbaum akzeptiert.

Der Ausdrucksbaum für den Lambda-Ausdruck sieht folgendermaßen aus:

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

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow