Entity Framework stellt auch Verknüpfungen zwischen Objekte, die die Anwendung hintereinander in den Context lädt, über deren Navigationseigenschaften her. Ich bezeichne dies als Pre-Loading. Pre-Loading kann eine effiziente Alternative zum Eager Loading darstellen, zumal Entity Framework beim Einsatz von Eager Laoding sämtliche Daten über eine einzige Abfrage lädt. Um benachbarte Daten zu laden, kommen dabei Outer-Joins zum Einsatz. Diese bewirken, dass sich die abgerufene Datenmenge aufbläht, zumal die einzelnen Spalten ausgekreuzt werden. Würde die Anwendung auf diese Weise zum Beispiel 20 Regionen mit 20 Hotels und 20 Ferienwohnungen laden, so würde die Ergebnismenge durch den Outer-Join aus 20 20 20 Datensätzen bestehen, obwohl darin insgesamt lediglich 3 * 20 Objekte zu finden sind.
Durch den Einsatz von Pre-Loading erhöht sich zwar die Anzahl der Datenbankabfragen, dafür verringert sich die Anzahl der abzurufenden Datensätze, da man mit weniger Outer-Joins auskommt. Das nächste Listing veranschaulicht dies anhand eines einfachen Beispiels. Zuerst lädt es sämtliche Regionen. Obwohl die Anwendung mit diesen Regionen nichts macht, landen sie durch den Ladevorgang im Context. Anschließend lädt es ausgewählte Hotels. Diese verknüpft Entity Framework mit den Regionen im Context unter Verwendung der abgerufenen Fremdschlüssel. Aus diesem Grund kann die Anwendung in weiterer Folge über die Eigenschaft Region auf die Region des Hotels zugreifen.
using (var ctx = new HotelDbContext())
{
ctx.Region.ToList();
var hotels = ctx.Hotel.Where(h => h.Sterne >= 3).ToList();
foreach (var h in hotels)
{
Debug.WriteLine(h.Bezeichnung);
Debug.WriteLine(h.Region.Bezeichnung);
}
}
Beim Einsatz von Pre-Loading als Alternative zu Eager-Loading muss der Entwickler abwiegen, was sich effizienter gestaltet: Das Auskreuzen der abgerufenen Daten durch den Outer-Joins oder das Absetzen mehrerer Abfragen.