2013-04-05 12 views
7

Ich brauche ein kleines Stück Magie. Ich glaube, was ich versuche zu tun, macht Sinn, aber wenn ich kein Problem mit dem Plan gesehen habe, wären die Gründe, warum, genauso willkommen.Cast Lambda-Ausdruck zu abgeleiteten Typ

Ich habe einen Ausdruck

Expression<Func<Entity, bool>>

und ich möchte werfen/konvertieren oder sogar einen ganz neuen Ausdruck erstellen:

Expression<Func<Derived, bool>>

Dies wird als EF Filterabfrage verwendet wird, , übergeben als Argument an eine Repository-Methode. Das Repository gibt einen Enumerable von Entity zurück, so dass ich die Covarianz einfach genug verwenden kann, aber ich möchte eine Nachbearbeitung der Abfrage in ihrem abgeleiteten Zustand durchführen, bevor ich sie zurückschicke.

Es scheint mir, dass EF dies intern selbst tun muss, aber ich würde gerne meine Abfrage ausführen können, so dass der Typ des Ergebnisses abgeleiteten Typ und nicht Entität ist.

Danke für Ihre Hilfe.

+2

Was passiert, wenn Sie einen Cast zu Ihrer Anfrage hinzufügen? –

+0

Ich bin mir nicht sicher, ob das ein Duplikat ist, aber es ist definitiv sehr ähnlich zu mir (http://stackoverflow.com/q/2797261/50079) von mir. – Jon

+0

Argh verdammt. Ich war dick. Danke, dass du die Blutung klargestellt hast. – MJM

Antwort

3

Wenn Sie Ihren Ausdruck Expression<Func<Entity, bool>> haben, können Sie einen Cast<Derived> hinzufügen, um nach allen Entitäten mit diesem spezifischen Typ zu filtern.

3

Arbeiten auf der Expression Ebene können Sie einen neuen Ausdruck mit dem Derived Typ als Parameter bauen:

var entityExpr = (Expression<Func<Entity, bool>>)(e => e.Str == ""); 
var derivedExpr = Expression.Lambda<Func<Derived, bool>>(entityExpr.Body, entityExpr.Parameters); 
Verwandte Themen