Sdílet prostřednictvím


Vzdálené a místní spuštění

Můžete se rozhodnout, že dotazy spustíte vzdáleně (to znamená, že databázový stroj provede dotaz na databázi) nebo místně (LINQ to SQL provede dotaz proti místní mezipaměti).

Vzdálené spuštění

Představte si následující dotaz:

            Northwnd db = new Northwnd(@"northwnd.mdf");
            Customer c = db.Customers.Single(x => x.CustomerID == "19283");
foreach (Order ord in
    c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
    // Do something.
}
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim c As Customer = _
(From cust In db.Customers _
 Where cust.CustomerID = 19283).First()
    Dim orders = From ord In c.Orders _
                 Where ord.ShippedDate.Value.Year = 1998
    For Each nextOrder In orders
        ' Do something.
    Next

Pokud vaše databáze obsahuje tisíce řádků objednávek, nechcete je načíst, aby bylo možné zpracovat malou podmnožinu. V LINQ to SQL EntitySet<TEntity> třída implementuje IQueryable rozhraní. Tento přístup zajišťuje, aby se tyto dotazy mohly spouštět vzdáleně. Dvě hlavní výhody toku z této techniky:

  • Nepotřebná data se nenačtou.

  • Dotaz spouštěný databázovým strojem je často efektivnější z důvodu indexů databáze.

místní spuštění

V jiných situacích můžete chtít mít úplnou sadu souvisejících entit v místní mezipaměti. Pro tento účel EntitySet<TEntity> poskytuje metodu Load explicitně načíst všechny členy EntitySet<TEntity>.

Pokud je již načtený EntitySet<TEntity> , následné dotazy se spustí místně. Tento přístup pomáhá dvěma způsoby:

  • Pokud se úplná sada musí používat místně nebo několikrát, můžete se vyhnout vzdáleným dotazům a přidruženým latencím.

  • Entitu lze serializovat jako úplnou entitu.

Následující fragment kódu ukazuje, jak lze získat místní spuštění:

            Northwnd db = new Northwnd(@"northwnd.mdf");
            Customer c = db.Customers.Single(x => x.CustomerID == "19283");
c.Orders.Load();

foreach (Order ord in
    c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
    // Do something.
}
        }
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim c As Customer = _
(From cust In db.Customers _
 Where cust.CustomerID = 19283).First
    c.Orders.Load()

    Dim orders = From ord In c.Orders _
                 Where ord.ShippedDate.Value.Year = 1998

    For Each nextOrder In orders
        ' Do something.
    Next

Porovnání

Tyto dvě funkce poskytují výkonnou kombinaci možností: vzdálené spuštění velkých kolekcí a místního spouštění pro malé kolekce nebo v případě, že je potřeba kompletní kolekce. Implementace vzdáleného spuštění prostřednictvím IQueryablea místního spuštění v kolekci v paměti IEnumerable<T> . Chcete-li vynutit místní spuštění (tj IEnumerable<T>. ), viz Převod typu na obecný IEnumerable.

Dotazy na neuspořádané sady

Všimněte si důležitého rozdílu mezi místní kolekcí, která implementuje List<T> a kolekcí, která poskytuje vzdálené dotazy spouštěné proti neuspořádaným sadám v relační databázi. List<T> metody, jako jsou například ty, které používají hodnoty indexu, vyžadují sémantiku seznamu, které se obvykle nedají získat prostřednictvím vzdáleného dotazu proti neuspořádané sadě. Z tohoto důvodu takové metody implicitně načítají EntitySet<TEntity> , aby umožňovaly místní spuštění.

Viz také