Entity Frameworks enthält (): Leistungs Engpass mit großen Datensätzen
Die Contains()
-Methode von Entity Framework mit umfangreichen Datensätzen kann die Leistung stark beeinflussen. Dies ergibt sich aus seiner Übersetzung in eine Reihe von oder Aussagen innerhalb des generierten SQL, was beim Umgang mit zahlreichen Vergleiche ineffizient wird.
Betrachten Sie dieses Beispiel:
<code class="language-csharp">var ids = Main.Select(a => a.Id).ToArray(); var rows = Main.Where(a => ids.Contains(a.Id)).ToArray();</code>
Ein Vergleich mit einer 10.000-Rekord-Tabelle und einem 100-Elemente-Array kann bis zu 288-mal langsamer sein als eine einfache Linq-Abfrage, die alle Zeilen abholt. Die Grundursache liegt in dem mangelnden nativen ado.net -Unterstützung für Ausdrücke. EFs Problemumgehung - ein komplexer oder Expressionbaum - ist für große Eingangssätze rechenintensiv.
Lösungen und Strategien
Der optimale Ansatz besteht darin, den In()
-Preiber zu nutzen, da er von ADO.NET -Anbietern nativ unterstützt wird, was zu effizienteren SQL führt.
Wenn In()
nicht machbar ist, betrachten Sie diese Alternativen:
CompiledQuery
erfordert grundlegende Datentypen. Um es mit Arrays oder IEnumerable
zu verwenden, erstellen Sie eine benutzerdefinierte Funktion, die die Eingabe in einen grundlegenden Typ konvertiert (z. B. eine von Kommas getrennte Zeichenfolge). Diese konvertierte Zeichenfolge kann dann in einem CompiledQuery
verwendet werden, der den In()
-Operator verwendet. nach vorne
Das Entity Framework -Team ist sich dieser Leistungsbeschränkung bewusst und untersucht die native Unterstützung für Ausdrücke im Anbietermodell. Diese Verbesserung würde die Leistung für große Datensätze erheblich verbessern. Contains()
Das obige ist der detaillierte Inhalt vonWarum ist der Operator „Contains()' von Entity Framework bei großen Datensätzen so langsam?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!