Da LINQ to Entities keine "benutzerdefinierten Methoden" unterstützt, wie bleibst du DRY?

8

Ich habe auf dieses Problem gestoßen:

Benutzerdefinierte Methoden & amp; Erweiterungsmethoden können nicht in einen Geschäftsausdruck übersetzt werden

Grundsätzlich habe ich einige komplizierte LINQ-Abfragen, also wollte ich sie in Unterabfragen zerlegen, die als Methoden implementiert werden, die IQueryables zurückgeben. Meine Hoffnung war dann diese IQueryables könnten zusammen in einer LINQ-Anweisung (wie ich ziemlich sicher bin, dass Sie in LINQ zu SQL tun können) zusammengestellt werden.

Das Problem ist, wenn Sie dies versuchen, erhalten Sie (zum Beispiel):

  

LINQ to Entities erkennt nicht   die Methode   'System.Linq.IQueryable'1 [Thema]   GetThreadsByMostReccentlyPosted (Int32) '   Methode, und diese Methode kann nicht sein   übersetzt in einen Geschäftsausdruck.

Es scheint mir sehr wichtig zu sein, dass Sie, wenn Sie ein LINQ-ORM verwenden, in der Lage sein müssen, LINQ-Abfragen zu erstellen. Sonst muss jede übliche Abfragelogik kopiert & amp; eingefügt.

Wie soll ich angesichts dieser Einschränkung DRY bei LINQ zu Entitäten bleiben?

    
Schneider 11.01.2010, 15:16
quelle

2 Antworten

12

Zwei Möglichkeiten:

  1. Methoden, die Ausdrücke zurückgeben, können verwendet werden
  2. Trennen Sie die abfragbaren und aufzählbaren Bits

Für # 1:

%Vor%

Ein Beispiel für Nummer 2 finden Sie in diesem Artikel: Erstellen von L2O- und L2E-Abfragen . Betrachten Sie das dort gegebene Beispiel:

%Vor%

Dies könnte weniger effizient sein, oder es könnte in Ordnung sein. Es hängt davon ab, was Sie tun. Es ist normalerweise gut für Projektionen, oft nicht OK für Einschränkungen.

Aktualisieren Gerade gesehen eine noch bessere Erklärung der Option # 1 von Damien Guard.

    
Craig Stuntz 11.01.2010, 16:30
quelle
0

EF kann keine Abfrage aus einem LINQ-Ausdruck erstellen, der eine Methode enthält. EF benötigt Literalwerte, um das SQL zu erstellen.

Sie müssen mit "allgemeinen" Abfragen auskommen, die eine Obermenge der Entitäten zurückgeben, die Sie für einen bestimmten Fall benötigen, und dann die Erweiterungsmethoden und LINQ verwenden, um den Rückgabewert einzugrenzen, sobald er aus der Datenbank zurückgegeben wurde.

    
Dave Swersky 11.01.2010 15:40
quelle