C# Wie konvertiert einen Ausdruck<U<SomeType>> Ausdruck<U<OtherType>>
Habe ich verwendet C# - Ausdrücke vor, basierend auf lamdas, aber ich habe keine Erfahrung Komponieren Sie mit der hand. Gegeben eine Expression<Func<SomeType, bool>> originalPredicate
ich möchte erstellen Sie eine Expression<Func<OtherType, bool>> translatedPredicate
.
In diesem Fall SomeType und OtherType haben die gleichen Felder, aber Sie sind nicht verwandt (keine Vererbung und nicht auf der Grundlage einer gemeinsamen Schnittstelle).
Hintergrund: ich habe eine repository-Implementierung auf Basis von LINQ to SQL. I-Projekt, das LINQ to SQL-Entitäten zu meinem Modell Entitäten, um mein Modell in POCO. Möchte ich weitergeben Ausdrücken, um das repository (als eine form von Spezifikationen), aber Sie sollte auf der Grundlage der Modell-Entitäten. Aber ich kann nicht passieren die Ausdrücke, die den Daten-Kontext, da es erwartet, Ausdrücke basierend auf den LINQ to SQL-Entitäten.
InformationsquelleAutor der Frage Michiel van Oosterhout | 2009-03-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
Expression
der einfachste Weg ist mit einem Umsatz Ausdruck:Beachten Sie jedoch, dass diese unterstützt werden unterschiedlich von den verschiedenen Anbietern. EF vielleicht nicht, wie es, zum Beispiel, auch wenn LINQ-to-SQL.
Die andere option ist, um den Wiederaufbau der expression tree komplettmit Reflexion zu finden, die entsprechenden Mitglieder. Sehr viel komplexer.
InformationsquelleAutor der Antwort Marc Gravell
Gibt es noch eine andere Möglichkeit, die ich gefunden habe, beinhaltet auch die Verpackung Ihrer ursprünglichen delegieren.
InformationsquelleAutor der Antwort sQuir3l
Es gibt keine implizite Art und Weise zu tun, die übersetzung. Sie haben, um wickeln Sie Ihre bestehenden Delegat in einen lambda-Ausdruck, der schafft eine neue Art von argument-Typ:
Wo
OtherTypeFromSomeType
schafft dieOtherType
Instanz aus derSomeType
argument.InformationsquelleAutor der Antwort Konrad Rudolph
Hatte ich das gleiche Problem wie Sie und ich fest, wie diese mit EF:
Entity Framework weiß, wie bauen Sie den richtigen sql-Befehl. Die Umwandlung der Ausdruck ist viel komplizierter, denn es ist gebaut, um die unveränderlich und könnte dazu führen, unerwünschten Laufzeit-Effekte, wenn Sie etwas falsch machen, und, in meinem Fall zumindest, ist es nicht notwendig.
InformationsquelleAutor der Antwort Eremencu Adrian