C # Linq - holt Objekte mit nicht leerer Sammlung

9

Ich habe:

%Vor%

1) Wie bekomme ich List<Graph> aus der Datenbank, wo Points nicht leer ist?

%Vor%

2) Wie wird es ausgeführt?

%Vor%

Die Ausnahme ist:

  

LINQ to Entities erkennt die Methode '...' nicht und   Diese Methode kann nicht in einen Geschäftsausdruck übersetzt werden.

    
Actic 27.05.2015, 06:48
quelle

2 Antworten

1

Es gibt kein Problem mit Enumerable.Contains () in EF. Es ist String.Contains , das nicht übersetzt werden kann.

Das Problem mit Ihrer zweiten Abfrage besteht darin, dass Sie LINQ-Operatoren mit Objektzugriffscode kombinieren, insbesondere colorSet[1] . LINQ to EF wird nicht versuchen, diesen Code auszuführen und weiß nicht, wie er es trotzdem in SQL übersetzt.

Die Lösung besteht darin, den colorSet-Wert zuerst in der Variablen zu speichern:

%Vor%

LINQ to EF weiß, dass Enumerable<T>.Contains() in AND Color IN (0,1) clause

übersetzt werden muss

Dies setzt voraus, dass Sie mindestens EF 5 verwenden, Color ist eine Enumeration und zeigen Sie eine benutzerdefinierte Klasse an, zB:

%Vor%

AKTUALISIEREN

Wie bei der ersten Frage können Sie Graphen, die Punkte enthalten, mit Any() :

abrufen %Vor%

Linq to EF generiert eine SQL-Anweisung mit einer WHERE EXISTS -Klausel zB

%Vor%

Dies wird die Graphen zurückgeben, die Punkte haben, aber nicht die Punkte selbst. Diese werden beim Versuch, auf die Points -Eigenschaft eines Graph-Objekts zuzugreifen, faul geladen. Dies kann ein Leistungsgewinn sein, wenn Sie nur auf einige Points -Eigenschaften zugreifen möchten, aber zahlreiche Abfragen ergeben, wenn Sie auf alle zugreifen möchten (das N + 1-Problem)

Wenn Sie auch die Punkte laden möchten, müssen Sie die Methode Include() verwenden, zB:

%Vor%

Dies führt einen linken Join zwischen den Graphen und Punkten aus und gibt alle Daten in einer einzigen Abfrage zurück.

    
Panagiotis Kanavos 27.05.2015, 07:41
quelle
2

.Contains kann nicht in der .Where-Klausel eines Datenbankkontexts verwendet werden. Sie können .Any oder .All für Vergleiche verwenden.

%Vor%

Siehe Verwendung von contains () in LINQ to SQL

    
Jan Johansen 27.05.2015 06:56
quelle

Tags und Links