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 implementerar EntitySet<TEntity>-klassen IQueryable-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 exekvering

I andra situationer kanske du vill ha en fullständig uppsättning relaterade entiteter i det lokala cacheminnet. För detta ändamål tillhandahåller EntitySet<TEntity> metoden Load 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 exekveras:

            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 generisk 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 in EntitySet<TEntity> implicit för att tillåta körning lokalt.

Se även