Problemumgehungen für die Verwendung benutzerdefinierter Methoden / Erweiterungsmethoden in LINQ to Entities

8

Ich habe eine GenericRepository-Klasse definiert, die die db-Interaktion ausführt.

%Vor%

Und in meinen BLL-Klassen kann ich die db wie folgt abfragen:

%Vor%

BinaryAnd ist eine Erweiterungsmethode, die bitweise zwei int-Werte überprüft. z.B. AccessLevel=5 = & gt; AccessLevel.BinaryAnd(5) und AccessLevel.binaryAnd(1) geben beide wahr zurück.

Allerdings kann ich diese Erweiterungsmethode nicht in meinen LINQ-Abfragen verwenden. Ich bekomme einen Laufzeitfehler wie folgt:
LINQ to Entities does not recognize the method 'Boolean BinaryAnd(System.Object, System.Object)' method, and this method cannot be translated into a store expression.

Ich habe auch versucht, es in eine benutzerdefinierte Methode zu ändern, aber kein Glück. Was sind die Problemumgehungen?

Soll ich alle Alben holen und sie dann durch eine foreach-Schleife iterieren und diejenigen auswählen, die den AccessLevels entsprechen?

    
Kamyar 01.02.2011, 19:32
quelle

3 Antworten

7

Sie können nur die Core-Erweiterungsmethoden und CLR-Methoden verwenden, die für Ihren EF-Provider definiert wurden Verwenden von Entity Framework und Abfragen in IQueryable<T> . Dies liegt daran, dass die Abfrage direkt in SQL-Code übersetzt und auf dem Server ausgeführt wird.

Sie können die gesamte Sammlung streamen (mit .ToEnumerable() ), diese dann lokal abfragen oder in eine Methode konvertieren, die von Ihrem Provider direkt in SQL übersetzt werden kann.

grundlegende bitweise Operationen werden unterstützt :

  

Die bitweisen Operatoren AND, OR, NOT und XOR werden auch kanonischen Funktionen zugeordnet, wenn der Operand ein numerischer Typ ist.

Wenn Sie also das schreiben, um keine Methode zu verwenden, und die bitweise Operation für den Wert direkt ausführen, sollte es nach Bedarf funktionieren. Versuchen Sie etwas wie folgt:

%Vor%

(Ich bin mir nicht sicher, wie Ihre aktuelle Erweiterungsmethode genau funktioniert - das obige würde prüfen, ob eines der Flags wieder wahr ist, was Ihrer Aussage zu entsprechen scheint ...)

    
Reed Copsey 01.02.2011, 19:37
quelle
8

Ich weiß, dass dies bereits eine akzeptierte Antwort hat. Ich dachte nur, ich würde dies posten, falls jemand versuchen sollte, einen LINQ-Interceptor zu schreiben.

Also ... hier ist, was ich getan habe, um übersetzbare benutzerdefinierte Erweiterungsmethoden zu machen: Codebeispiel

Ich glaube nicht, dass dies eine fertige Lösung ist, aber es sollte hoffentlich einen guten Ausgangspunkt für jeden bieten, der mutig genug ist, es bis zur Fertigstellung zu Ende zu bringen.

    
Lord Terabyte 23.05.2012 19:04
quelle
1

Es gibt Möglichkeiten, die linq-Abfrage zu ändern, kurz bevor EF sie in SQL übersetzt. In diesem Moment müssten Sie Ihre '' fremde '' Methode in ein Konstrukt übersetzen, das von EF übersetzt werden kann.

Siehe eine vorherige Frage von mir Wie wird Entity Framework so umbrochen, dass es den LINQ-Ausdruck kurz vor der Ausführung abfängt? und meine EFWrappableFields-Erweiterung , die einfach funktioniert dies für umwickelte Felder.

    
Davy Landman 01.02.2011 19:50
quelle