Ich habe:
%Vor% 1) Wie bekomme ich List<Graph>
aus der Datenbank, wo Points
nicht leer ist?
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.
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
Dies setzt voraus, dass Sie mindestens EF 5 verwenden, Color
ist eine Enumeration und zeigen Sie eine benutzerdefinierte Klasse an, zB:
AKTUALISIEREN
Wie bei der ersten Frage können Sie Graphen, die Punkte enthalten, mit Any()
:
Linq to EF generiert eine SQL-Anweisung mit einer WHERE EXISTS
-Klausel zB
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:
Dies führt einen linken Join zwischen den Graphen und Punkten aus und gibt alle Daten in einer einzigen Abfrage zurück.
.Contains kann nicht in der .Where-Klausel eines Datenbankkontexts verwendet werden. Sie können .Any oder .All für Vergleiche verwenden.
%Vor%