Erstellen Sie linq-Ausdruck manuell für x => x.Child == itemToCompare.Child

expression-trees lambda linq

Frage

Wir haben ein Objekt und wir wollen eine Linq-Abfrage basierend auf diesem Objekt im laufenden Betrieb erstellen. Diese linq-Anweisung entspricht dem, was wir erstellen möchten:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Wir können nicht den richtigen Ausdruck finden, um den itemToCompare.Child-Teil zu erstellen. Folgendes haben wir bisher:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Der Ausdrucksbaum für unsere von Hand erstellte Abfrage sieht folgendermaßen aus:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Der Ausdrucksbaum für das tatsächliche Lambda sieht folgendermaßen aus:

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Bearbeiten:

Wir denken, dass das funktioniert

Expression<Func<Sample, bool>> linqExpression 
            = x => x.Child == itemToCompare.Child;

Das versuchen wir in unserem Ausdruck zu reproduzieren.

Letztendlich besteht das Ziel darin, einen Ausdruck zu erzeugen, in dem die Child-Werte mit der Methode .Equals () des Typs verglichen werden.

Vielen Dank!

Akzeptierte Antwort

Du wirst durch das "innere Lambda" verwirrt. Es gibt nur einen Lambda-Ausdruck:

var param = Expression.Parameter(typeof(Sample), "x");
var key = itemToCompare.GetType().GetProperty("Child");
var rhs = Expression.MakeMemberAccess(Expression.Constant(itemToCompare), key);
var lhs = Expression.MakeMemberAccess(param, key);
var body = Expression.Equal(lhs, rhs);
var lambda = Expression.Lambda<Func<Sample, bool>>(body, param);



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum