Távoli és helyi végrehajtás
Dönthet úgy, hogy távolról hajtja végre a lekérdezéseket (vagyis az adatbázismotor végrehajtja a lekérdezést az adatbázison) vagy helyileg (az SQL LINQ-jának használatával a lekérdezést helyi gyorsítótárban hajtja végre).
Távoli végrehajtás
Fontolja meg a következő lekérdezést:
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
Ha az adatbázis több ezer sornyi megrendeléssel rendelkezik, nem szeretné lekérni őket egy kis részhalmaz feldolgozásához. A LINQ-ban az SQL-ben az EntitySet<TEntity> osztály implementálja az interfészt IQueryable . Ez a módszer biztosítja, hogy az ilyen lekérdezések távolról is végrehajthatók legyenek. Ennek a technikának két fő előnye van:
A szükségtelen adatok lekérése nem történik meg.
Az adatbázismotor által végrehajtott lekérdezések gyakran hatékonyabbak az adatbázisindexek miatt.
Helyi végrehajtás
Más helyzetekben előfordulhat, hogy a kapcsolódó entitások teljes készletét a helyi gyorsítótárban szeretné használni. Ebből a célból megadja a metódustLoad, EntitySet<TEntity> hogy explicit módon betöltse a EntitySet<TEntity>.
Ha egy EntitySet<TEntity> már be van töltve, a rendszer helyileg hajtja végre a további lekérdezéseket. Ez a megközelítés kétféleképpen segít:
Ha a teljes készletet helyileg vagy többször kell használni, elkerülheti a távoli lekérdezéseket és a kapcsolódó késéseket.
Az entitás szerializálható teljes entitásként.
Az alábbi kódrészlet bemutatja, hogyan szerezhető be a helyi végrehajtás:
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
Összehasonlítás
Ez a két lehetőség a lehetőségek hatékony kombinációját nyújtja: távoli végrehajtás nagy gyűjteményekhez és helyi végrehajtás kis gyűjteményekhez, vagy ahol a teljes gyűjteményre szükség van. Távoli végrehajtást hajthat végre egy memórián IEnumerable<T> belüli gyűjteményen keresztül IQueryableés helyi végrehajtással. A helyi végrehajtás kényszerítéséhez (azaz IEnumerable<T>) lásd : Típus átalakítása általános IEnumerable-vé.
Lekérdezések rendezetlen készletek ellen
Figyelje meg a megvalósítandó List<T> helyi gyűjtemény és a relációs adatbázisban lévő rendezetlen csoportokon végrehajtott távoli lekérdezéseket biztosító gyűjtemény közötti fontos különbséget. List<T> Az indexértékeket használó metódusokhoz listaszemantika szükséges, amely általában nem kérhető le távoli lekérdezéssel rendezetlen halmazon keresztül. Ezért az ilyen metódusok implicit módon töltik be a EntitySet<TEntity> helyi végrehajtás engedélyezéséhez.