Ich habe eine Klasse, Benutzer .
Benutzer besitzt eine Eigenschaft UserId .
Ich habe eine Methode, die ungefähr so aussieht:
%Vor%Zwangsläufig, wenn ich die Funktion rufe:
%Vor%Ich bekomme die folgende Ausnahme:
Methode 'System.Object DynamicInvoke (System.Object [])' hat keine unterstützte Übersetzung in SQL.
Gibt es eine Lösung für dieses Problem? Wie weit muss ich das Kaninchenloch von Expression.KillMeAndMyFamily () hinunter gehen?
Zur Klärung warum mache ich das: Ich benutze T4-Vorlagen, um automatisch ein einfaches Repository und ein System von Pipes zu generieren. Innerhalb der Rohre, anstatt zu schreiben:
%Vor%Ich möchte etwas erzeugen wie:
%Vor% Nehmen wir UserId
als Beispiel. Sie möchten schreiben:
und möchte, dass dies dasselbe ist wie:
%Vor%Was Sie tun müssen, ist den Ausdrucksbaum der ersten Version zu nehmen und ihn in die zweite Version zu übersetzen.
Ändern Sie also zuerst die Signatur von UserId
, um einen Ausdrucksbaum anstelle eines kompilierten Lambda zu akzeptieren:
Schreiben Sie dann eine Methode, die den ersten Ausdrucksbaum in die zweite Version konvertiert. Schauen wir uns die zwei Ausdrucksbäume an:
Eingabe:
%Vor%Ausgabe:
%Vor% Wie Sie sehen können, müssen Sie nur den Rumpf des Lambda übernehmen, rekursiv alle Vorkommen des Parameters uid
durch die Eigenschaft UserId
im Parameter user
ersetzen und einen neuen Lambda-Ausdruck mit erstellen der transformierte Körper und der Parameter user
.
Sie können einen ExpressionVisitor verwenden, um den Austausch durchzuführen.
Dank dtb, hier ist, was ich gefunden habe:
%Vor%Nun kann ich das Prädikat, methinks, mit etwas wie dem folgenden Code konvertieren. Ich habe diesen Code ein wenig getestet. es scheint zu funktionieren, aber ich würde Interesse haben, irgendwelche Kommentare / Bedenken zu hören:
%Vor%Auf den ersten Blick sieht es so aus, als würden Sie einige Ausdrücke erstellen, die Linq nicht in T-SQL übersetzen kann.
Ich verstehe vielleicht nicht, was Sie zu tun versuchen, aber wenn Sie kettenfähige Ausdrücke erstellen möchten, die Linq To Sql verstehen kann, empfehle ich Ihnen, sich die PredicateBuilder-Erweiterungen anzuschauen. hier . Auch wenn es nicht genau das ist, was Sie wollen, können Sie verstehen, wie es funktioniert, und Ihnen einen Einblick geben, was Sie unter dem Deckmantel erreichen müssen, um das zu erreichen, was Sie gerade tun.
Tags und Links c# lambda linq-to-sql