Nach dem Upgrade von EF Core 2.2 auf EF Core 3.0 ist ein großes Leistungsproblem aufgetreten. Stellen Sie sich ein einfaches Datenmodell mit einer einzigen Sammlungsnavigationseigenschaft und Hunderten von Feldern vor (die Realität sieht noch dunkler aus):
public class Item
{
[Key]
public int ItemID {get;set;}
public ICollection<AddInfo> AddInfos {get;set;}
... // consisting of another 100+ properties!
}
und
public class AddInfo
{
[Key]
public int AddInfoID {get;set;}
public int? ItemID {get;set;}
public string SomePayload {get;set;}
}
Während des Abrufs von Elementen werden folgende Abfragen durchgeführt:
...
var myQueryable = this._context.Items.Include(i => i.AddInfos).Where(**some filter**);
... // moar filters
var result = myQueryable.ToList();
Bis zu diesem Punkt geradeaus.
In EF 2.2 führt das Abrufen dieser abfragbaren Datei zu zwei separaten Abfragen, eine für Item
und eine für die AddInfo
Ebene. Diese Abfragen holen normalerweise 10.000 items
und ungefähr 250.000 ab AddInfos
.
In EF - Core 3.0 jedoch eine einzelne Abfrage generiert wird, links Beitritt AddInfo
zu , Item
dass auf den ersten Blick erscheint die bessere Option zu sein. Unser Item
Feld muss jedoch mit allen über 100 Feldern abgerufen werden, weshalb eine Projektion auf eine kleinere Klasse oder einen anonymen Typ (Hinzufügen eines Aufrufs zur .Select (...) - Methode) nicht möglich ist. Daher enthält die Ergebnismenge so viel Redundanz (jeweils Item
ca. 25 Mal), dass die Abfrage selbst zu lange dauert, um in einer akzeptablen Zeit ausgeführt zu werden.
Bietet EF-Core 3.0 eine Option, mit der wir ohne umfangreiche Änderungen an unserem Datenmodell zum Abfrageverhalten des guten alten EF Core 2.2 zurückkehren können ? Wir profitieren bereits von dieser Änderung in anderen Teilen der Anwendung, jedoch nicht in diesem speziellen Szenario.
Vielen Dank im Voraus!
Aktualisieren
Nach weiteren Untersuchungen stellte ich fest, dass dieses Problem hier bereits bei Microsoft behoben wurde und es keine Möglichkeit gibt, die Ausführung der geteilten Abfrage zu konfigurieren.
quelle
Antworten:
Nach dem Update meiner ersten Frage gingen die Erkenntnisse so weit, dass ich mir sicher war, dass es derzeit keine integrierte Konfiguration gibt, um zur Ausführung der geteilten Abfrage zurückzukehren.
MS hat hier jedoch Codebeispiele bereitgestellt, wie dies mit minimalen Codeänderungen (für unseren Anwendungsfall!) Zu tun ist .
Wir entfernen einfach die .Include (...) -Aufrufe für Sammlungsnavigationseigenschaften (1: n-Beziehungen in unserem Fall, 1: 1-Beziehungen sind nicht betroffen!). Nach dem Abrufen der Elemente tätigen wir einfach einen weiteren Anruf mit:
Dadurch werden die Entitäten der Sammlungsnavigationseigenschaften abgerufen und - wenn die Änderungsverfolgung aktiviert ist - automatisch die Sammlungen für die einzelnen Elemente in der
result
Variablen gefüllt.quelle