Sdílet prostřednictvím


Odložené vs. okamžité načítání

Při dotazování na objekt ve skutečnosti načtete pouze požadovaný objekt. Související objekty se automaticky nenačítají současně. (Další informace najdete v tématu Dotazování napříč relacemi.) Nelze zobrazit skutečnost, že související objekty ještě nejsou načteny, protože pokus o přístup k nim vytvoří požadavek, který je načte.

Můžete například chtít zadat dotaz na konkrétní sadu objednávek a pak jenom občas poslat e-mailové oznámení konkrétním zákazníkům. Nemusíte nutně načítat všechna zákaznická data s každou objednávkou. Odložené načítání můžete použít k odložení načítání dalších informací, dokud nebudete muset. Představte si následující příklad:

    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

Opak může být také pravdivý. Můžete mít aplikaci, která musí zobrazit data zákazníků a objednávek najednou. Víte, že potřebujete obě sady dat. Víte, že vaše aplikace potřebuje informace o objednávce pro každého zákazníka, jakmile dostanete výsledky. Nechcete odesílat jednotlivé dotazy na objednávky pro každého zákazníka. Opravdu chcete načíst data objednávek společně se zákazníky.

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

Zákazníky a objednávky můžete připojit také v dotazu vytvořením křížového produktu a načtením všech relativních bitů dat jako jedné velké projekce. Tyto výsledky ale nejsou entitami. (Další informace najdete v tématu Objektový model LINQ to SQL). Entity jsou objekty, které mají identitu a které můžete upravit, zatímco tyto výsledky by byly projekce, které nelze změnit a zachovat. Ještě horší je, že načítáte velké množství redundantních dat, protože každý zákazník se opakuje pro každou objednávku ve výstupu zploštěného spojení.

To, co opravdu potřebujete, je způsob, jak načíst sadu souvisejících objektů současně. Sada je delineovaný oddíl grafu, takže byste nikdy nenačítá více nebo méně, než bylo nutné pro zamýšlené použití. Pro tento účel poskytuje DataLoadOptions LINQ to SQL okamžité načtení oblasti objektového modelu. Mezi metody patří:

  • Metoda LoadWith , která okamžitě načte data související s hlavním cílem.

  • Metoda AssociateWith pro filtrování objektů načtených pro určitou relaci.

Viz také