Aracılığıyla paylaş


Uzak ve Yerel Yürütme karşılaştırması

Sorgularınızı uzaktan (veritabanı altyapısı sorguyu veritabanına karşı yürütür) veya yerel olarak yürütmeye karar verebilirim (LINQ to SQL sorguyu yerel önbellekte yürütür).

Uzaktan Yürütme

Aşağıdaki sorguyu göz önünde bulundurun:

            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

Veritabanınızda binlerce sipariş satırı varsa, küçük bir alt kümeyi işlemek için tümünü almak istemezsiniz. LINQ to SQL'de EntitySet<TEntity> sınıfı arabirimini IQueryable uygular. Bu yaklaşım, bu tür sorguların uzaktan yürütülebilmesine olanak sağlar. Bu teknik, iki büyük fayda sağlar.

  • Gereksiz veriler alınmaz.

  • Veritabanı dizinleri nedeniyle veritabanı altyapısı tarafından yürütülen bir sorgu genellikle daha verimlidir.

Yerel Yürütme

Diğer durumlarda, yerel önbellekte ilgili varlık kümesinin tamamının olmasını isteyebilirsiniz. Bu amaçla, EntitySet<TEntity> yöntemini sağlayarak Load öğesinin tüm üyelerini EntitySet<TEntity> açıkça yükler.

EntitySet<TEntity> zaten yüklüyse, sonraki sorgular yerel olarak yürütülür. Bu yaklaşım iki şekilde yardımcı olur:

  • Kümenin tamamının yerel olarak veya birden çok kez kullanılması gerekiyorsa, uzak sorgulardan ve ilişkili gecikme sürelerinden kaçınabilirsiniz.

  • Varlık, eksiksiz bir varlık olarak seri hale getirilebilir.

Aşağıdaki kod parçası, yerel yürütmenin nasıl alınabileceğini gösterir:

            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

Karşılaştırma

Bu iki özellik, seçeneklerin güçlü bir birleşimini sağlar: büyük koleksiyonlar için uzaktan yürütme ve küçük koleksiyonlar için yerel yürütme veya koleksiyonun tamamının gerekli olduğu yer. Uzaktan yürütme IQueryable üzerinden gerçekleştirilirken, bellek içi IEnumerable<T> bir koleksiyona karşı yerel yürütme uygularsınız. Yerel yürütmeyi zorlamak için (yani, IEnumerable<T>), bkz Türü Genel IEnumerable'a Dönüştürme.

Sıralanmamış Kümelere Karşı Sorgular

Uygulayan yerel koleksiyon ile ilişkisel List<T> karşı yürütülen uzak sorgular sağlayan bir koleksiyon arasındaki önemli farka dikkat edin. List<T> dizin değerleri kullananlar gibi yöntemler liste semantiği gerektirir ve bunlar genellikle sıralanmamış bir kümeye karşı uzak sorgu aracılığıyla alınamaz. Bu nedenle, bu tür yöntemler EntitySet<TEntity> öğesini yükleyerek yerel yürütmeye izin verir.

Ayrıca bakınız