Linq to SQL DynamicInvoke (System.Object []) 'hat keine unterstützte Übersetzung in SQL

8

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%     
Evan Nagle 28.04.2010, 13:29
quelle

3 Antworten

15

Nehmen wir UserId als Beispiel. Sie möchten schreiben:

%Vor%

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:

%Vor%

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.

    
dtb 28.04.2010, 13:47
quelle
1

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%     
Evan Nagle 29.04.2010 07:23
quelle
0

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.

    
Sean 28.04.2010 14:07
quelle

Tags und Links