Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie ein Objekt abfragen, rufen Sie tatsächlich nur das angeforderte Objekt ab. Die zugehörigen Objekte werden nicht automatisch gleichzeitig abgerufen. (Weitere Informationen finden Sie unter Abfragen zwischen Beziehungen.) Die Tatsache, dass die zugehörigen Objekte noch nicht geladen sind, kann nicht angezeigt werden, da ein Versuch, auf sie zuzugreifen, eine Anforderung erzeugt, die sie abruft.
Sie können z. B. eine bestimmte Gruppe von Bestellungen abfragen und dann nur gelegentlich eine E-Mail-Benachrichtigung an bestimmte Kunden senden. Sie müssten zunächst nicht unbedingt alle Kundendaten mit jeder Bestellung abrufen. Sie können das verzögerte Laden verwenden, um das Abrufen zusätzlicher Informationen aufzuschieben, bis es unbedingt erforderlich ist. Betrachten Sie das folgenden Beispiel:
Northwnd db = new Northwnd(@"northwnd.mdf");
IQueryable<Order> notificationQuery =
from ord in db.Orders
where ord.ShipVia == 3
select ord;
foreach (Order ordObj in notificationQuery)
{
if (ordObj.Freight > 200)
SendCustomerNotification(ordObj.Customer);
ProcessOrder(ordObj);
}
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim notificationQuery = _
From ord In db.Orders _
Where ord.ShipVia = 3 _
Select ord
For Each ordObj As Order In notificationQuery
If ordObj.Freight > 200 Then
SendCustomerNotification(ordObj.Customer)
ProcessOrder(ordObj)
End If
Next
Das Gegenteil kann auch wahr sein. Möglicherweise verfügen Sie über eine Anwendung, die Kunden- und Bestelldaten gleichzeitig anzeigen muss. Sie wissen, dass Sie beide Datensätze benötigen. Sie wissen, dass Ihre Anwendung Bestellinformationen für jeden Kunden benötigt, sobald Sie die Ergebnisse erhalten. Sie möchten nicht einzelne Abfragen für Bestellungen für jeden Kunden übermitteln. Was Sie wirklich wollen, ist das Abrufen der Bestelldaten zusammen mit den Kunden.
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
db.DeferredLoadingEnabled = false;
IQueryable<Customer> custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
foreach (Customer custObj in custQuery)
{
foreach (Order ordObj in custObj.Orders)
{
ProcessCustomerOrder(ordObj);
}
}
Dim db As New Northwnd("c:\northwnd.mdf")
db.DeferredLoadingEnabled = False
Dim custQuery = _
From cust In db.Customers _
Where cust.City = "London" _
Select cust
For Each custObj As Customer In custQuery
For Each ordObj As Order In custObj.Orders
ProcessCustomerOrder(ordObj)
Next
Next
Sie können auch Kunden und Bestellungen in einer Abfrage zusammenfassen, indem Sie diese produktübergreifend gestalten und alle erforderlichen Daten in Form einer großen Projektion abrufen. Diese Ergebnisse sind jedoch keine Entitäten. (Weitere Informationen finden Sie im LINQ to SQL-Objektmodell). Entitäten sind Objekte, die Identität haben und die Sie ändern können, während es sich bei diesen Ergebnissen um Projektionen handelt, die nicht geändert und beibehalten werden können. Darüber hinaus würden Sie eine Menge redundanter Daten abrufen, da sich die Kunden bei jeder Bestellung in der optimierten gemeinsamen Abfrage wiederholen.
Was Sie wirklich benötigen, ist eine Möglichkeit, einen Satz verwandter Objekte gleichzeitig abzurufen. Dieser Satz ist ein isolierter Bereich eines Graphen, sodass Sie niemals mehr oder weniger Daten als benötigt abrufen. Linq to SQL stellt zu diesem Zweck das sofortige Laden eines Bereichs Ihres Objektmodells bereit DataLoadOptions . Die Methoden umfassen:
Die LoadWith Methode zum sofortigen Laden von Daten im Zusammenhang mit dem Hauptziel.
Die AssociateWith Methode zum Filtern von Objekten, die für eine bestimmte Beziehung abgerufen wurden.