Dynamische Umwandlung von IEnumerable in IQueryable oder dynamischen Aufruf von AsQueryable mit LINQ Expressions

8

Ich erstelle LINQ-Abfrage dynamisch, und ich mache bis jetzt OK.

Aber ich stecke fest, wo ich dachte, ich würde nicht sein. Zu einem bestimmten Zeitpunkt muss ich beim Erstellen dieser Abfrage auf EnityCollection einer Entität zugreifen. Etwas wie das:

%Vor%

Dann würde ich die "Wo" -LINQ-Methode für diese Sammlung aufrufen:

%Vor%

Und normalerweise würde das funktionieren. In diesem Fall wird es nicht, weil die Sammlung IEnumerable ist, und ich brauche es IQueryable in der Reihenfolge "wo" zu arbeiten.

Ich habe es versucht:

%Vor%

Es kann jedoch nicht gesendet werden, weil EntityCollection IQueryable nicht implementiert.

Ich verwende statisch AsQueryable, um zu erreichen, was ich hier brauche, also habe ich versucht, das dynamisch nachzuahmen:

%Vor%

, aber ich bekomme Null Referenz Ausnahme. Ich kann es nicht durch Reflexion erreichen. Diese AsQueryable-Methode ist eine Erweiterungsmethode, sie ist statisch und in der Klasse Queryable definiert. Daher habe ich Folgendes versucht:

%Vor%

Gleiches Ergebnis: "Wert kann nicht null sein".

Ich stoße hier an meine Grenzen und ich habe keine Ideen mehr.

Also, ich frage Sie:

Wie kann ich IEnumerable dynamisch in IQueryable umwandeln?

    
Milos Mijatovic 17.02.2012, 23:59
quelle

3 Antworten

5

Versuchen Sie, die Methode auf diese Weise zu erhalten:

%Vor%

Dann sollten Sie in der Lage sein, einen Aufruf an diese Methode wie folgt zu erstellen:

%Vor%

Das Problem mit Ihrem Code war, dass BindingFlags schwierig zu verwenden sind. Wenn Sie ein BindingFlags - wie BindingFlags.Static - angeben, müssen Sie auch explizit angeben, ob Sie BindingFlags.Public oder BindingFlags.NonPublic wollen.

Das zweite Problem besteht darin, dass es zwei AsQueryable-Methoden gibt - eine generische und eine nicht-generische Methode. Wenn Sie das Array von Typargumenten bereitstellen, wird diese Mehrdeutigkeit aufgelöst.

    
Igor ostrovsky 18.02.2012, 00:17
quelle
2
  

"Und normalerweise würde das funktionieren. In diesem Fall wird es nicht, weil die Sammlung IEnumerable ist und ich muss IQueryable sein, damit" Wo "funktioniert."

Nein, das tust du nicht. Verwenden Sie für einen Aufzählungscode Enumerable.Where anstelle von Queryable.Where .

%Vor%

Das erste "wo" wird in Queryable.Where aufgelöst, aber das zweite nicht, das ist Enumerable.Where . Das ist kein Problem oder ineffizient, weil der gesamte Ausdruck Teil einer Unterabfrage ist, so dass immer noch an den Abfrageanbieter gesendet und (zB) in SQL übersetzt wird.

    
hvd 18.02.2012 00:57
quelle
0

Ok, ich glaube ich habe es verstanden:

Bekommen Sie zuerst die Methode durch Reflexion, wie Igor sagte:

%Vor%

Dann habe ich eine andere Version von Expression.Call benutzt, um statische / instance Mismatch zu überwinden:

%Vor%

und schließlich in ein typisiertes AsQueryable:

%Vor%     
Milos Mijatovic 18.02.2012 09:52
quelle

Tags und Links