beide Abfrage Abrufen der entsprechenden Daten direkt mit dem ersten Abfrage von Eager Loading verwenden (und ja Eager Lade wird durch die Verwendung des Include
Verfahrens erreicht, wie man vermutet) und die zweiten Abfrage unter Verwendung von Lazy loading die standardmäßig ist. Aber da Ihre Abfrage nur EmailAddresses
wegen der Select()
und SelectMany()
Operationen zurückgibt, ändert die Include()
Methode nicht das Verhalten. Um zu sehen, wennInclude()
Methode Materie in Ihrem Beispiel ist lesen Sie die folgenden Zeilen, die ich es in einem Beispiel beweisen wird:
Um einen Unterschied zwischen diesen beiden Arten von Lade verbundenen Unternehmen Eager Laden wissen ist in der Regel effizienter, wenn Sie benötigen die zugehörigen Daten für alle abgerufenen Zeilen der Primärtabelle. Und auch wenn Relationen sindnicht zu viel, eifrig laden wird gute Praxis sein, um weitere Abfragen auf dem Server zu reduzieren. Aber wenn Sie wissen, dass Sie keine Immobilie sofort brauchen, dann ist das Lazy Loading vielleicht eine gute Wahl. Und auch das Eager Loading ist eine gute Wahl in Situationen, in denen der Db-Kontext entsorgt wird und das Lazy Loading nicht mehr möglich ist. Um zu beweisen, dass ein Lazy Loading-und eins ist Eager Laden Sie den folgenden Code betrachten:
public List<Person> GetEmailAddresses()
{
using (yourEntities awlt = new yourEntities())
{
var query = awlt.People
.Where(p => p.LastName.Equals(lastName));
return query.ToList();
}
}
Nach dem Aufruf dieser Methode können Sie nicht die damit verbundene Einrichtung träge geladen werden, da die db angeordnet ist. Um zu beweisen, versuchen Sie dies:
var query = GetEmailAddresses();
foreach (var item in query.SelectMany(a => a.EmailAddresses).Select(a => a.EmailAddress1))
{
MessageBox.Show(item);
}
Und Sie werden diesen Fehler erhalten:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
Aber wenn Sie die GetEmailAddresses
ändern Eager Laden verwenden wie folgt aus:
public List<Person> GetEmailAddresses()
{
using (yourEntities awlt = new yourEntities())
{
var query = awlt.People.Include("EmailAddresses")
.Where(p => p.LastName.Equals(lastName));
return query.ToList();
}
}
Dann wird der Code unten sollte gut funktionieren:
var query = GetEmailAddresses();
foreach (var item in query.SelectMany(a => a.EmailAddresses).Select(a => a.EmailAddress1))
{
MessageBox.Show(item);
}
Also in einer Situation, in der Ihr db-Kontext entsorgt würde, wäre die Eager Loading eine bessere Wahl.
Welche Version von EF? In Versionen vor 7 funktionieren beide gleich. Der einzige Unterschied wäre die Rückgabe der 'People'-Sammlung ohne weitere Abfragen. Dann würde 'EmailAddresses' nur gefüllt werden, wenn sie aufgerufen werden (faul) –
@RoyalBg: Ich benutze Version 6.1.3, Könnten Sie den Unterschied mehr erklären? –
Angenommen, Sie müssen das Ergebnis der 'awlt.People'-Abfrage serialisieren. Ohne Include erhalten Sie keine E-Mail-Adressen. Aber wenn Sie sie vor der Serialisierung aufrufen (in diesem Fall 'Select'), erhalten Sie sie, so dass Sie sie nicht benötigen. In Version 7 brauchst du immer include (oder so war es vor einem Monat) –