Fjärr- eller lokal körning
Du kan bestämma dig för att köra dina frågor antingen via fjärranslutning (dvs. databasmotorn kör frågan mot databasen) eller lokalt (LINQ till SQL kör frågan mot en lokal cache).
Fjärrkörning
Överväg följande fråga:
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
Om databasen har tusentals rader med beställningar vill du inte hämta dem alla för att bearbeta en liten delmängd. I LINQ till SQL EntitySet<TEntity> implementerar IQueryable klassen gränssnittet. Den här metoden ser till att sådana frågor kan köras via fjärranslutning. Två viktiga fördelar med den här tekniken:
Onödiga data hämtas inte.
En fråga som körs av databasmotorn är ofta effektivare på grund av databasindexen.
Lokal körning
I andra situationer kanske du vill ha en fullständig uppsättning relaterade entiteter i det lokala cacheminnet. För detta ändamål EntitySet<TEntity> tillhandahåller Load metoden för att uttryckligen läsa in alla medlemmar i EntitySet<TEntity>.
Om en EntitySet<TEntity> redan har lästs in körs efterföljande frågor lokalt. Den här metoden hjälper på två sätt:
Om den fullständiga uppsättningen måste användas lokalt eller flera gånger kan du undvika fjärrfrågor och tillhörande svarstider.
Entiteten kan serialiseras som en fullständig entitet.
Följande kodfragment illustrerar hur lokal körning kan hämtas:
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
Jämförelse
Dessa två funktioner ger en kraftfull kombination av alternativ: fjärrkörning för stora samlingar och lokal körning för små samlingar eller där hela samlingen behövs. Du implementerar fjärrkörning via IQueryable, och lokal körning mot en minnesintern IEnumerable<T> samling. Information om hur du framtvingar lokal körning (dvs IEnumerable<T>. ), finns i Konvertera en typ till en allmän IEnumerable.
Frågor mot osorterade uppsättningar
Observera den viktiga skillnaden mellan en lokal samling som implementerar List<T> och en samling som tillhandahåller fjärrfrågor som körs mot osorterade uppsättningar i en relationsdatabas. List<T> metoder som de som använder indexvärden kräver listsemantik, som vanligtvis inte kan hämtas via en fjärrfråga mot en osorterad uppsättning. Av den anledningen läser sådana metoder implicit in EntitySet<TEntity> för att tillåta lokal körning.