Aracılığıyla paylaş


Ertelenmiş ve Hemen Yükleme Karşılaştırması

Bir nesneyi sorguladığınızda, aslında yalnızca istediğiniz nesneyi alırsınız. İlgili nesneler aynı anda otomatik olarak getirilmiyor. (Daha fazla bilgi için bkz. İlişkiler Arasında Sorgulama.) İlgili nesnelerin zaten yüklenmediğini göremezsiniz, çünkü bunlara erişme girişimi onları alan bir istek oluşturur.

Örneğin, belirli bir sipariş kümesini sorgulamak ve belirli müşterilere yalnızca ara sıra bir e-posta bildirimi göndermek isteyebilirsiniz. Başlangıçta her siparişle tüm müşteri verilerini almanız gerekmez. Ek bilgilerin alınmasını kesinlikle zorunda olana kadar ertelemek için ertelenen yüklemeyi kullanabilirsiniz. Aşağıdaki örneği inceleyin:

    Northwnd db = new Northwnd(@"northwnd.mdf");

    IQueryable<Order> notificationQuery =
    from ord in db.Orders
 where ord.ShipVia == 3
  select ord;

    foreach (Order ordObj in notificationQuery)
    {
        if (ordObj.Freight > 200)
            SendCustomerNotification(ordObj.Customer);
        ProcessOrder(ordObj);
    }
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim notificationQuery = _
    From ord In db.Orders _
    Where ord.ShipVia = 3 _
    Select ord

For Each ordObj As Order In notificationQuery
    If ordObj.Freight > 200 Then
        SendCustomerNotification(ordObj.Customer)
        ProcessOrder(ordObj)
    End If

Next

Tersi de doğru olabilir. Müşteriyi görüntülemesi ve verileri aynı anda sipariş etmesi gereken bir uygulamanız olabilir. Her iki veri kümesine de ihtiyacınız olduğunu biliyorsunuz. Sonuçları alır almaz uygulamanızın her müşteri için sipariş bilgilerine ihtiyacı olduğunu biliyorsunuz. Her müşteri için siparişler için tek tek sorgu göndermek istemezsiniz. Asıl istediğiniz, sipariş verilerini müşterilerle birlikte almaktır.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

db.DeferredLoadingEnabled = false;

IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

foreach (Customer custObj in custQuery)
{
    foreach (Order ordObj in custObj.Orders)
    {
        ProcessCustomerOrder(ordObj);
    }
}
Dim db As New Northwnd("c:\northwnd.mdf")

db.DeferredLoadingEnabled = False

Dim custQuery = _
    From cust In db.Customers _
    Where cust.City = "London" _
    Select cust

For Each custObj As Customer In custQuery
    For Each ordObj As Order In custObj.Orders
        ProcessCustomerOrder(ordObj)
    Next
Next

Ayrıca, çapraz ürünü oluşturup tüm göreli veri bitlerini tek bir büyük projeksiyon olarak alarak bir sorgudaki müşterileri ve siparişleri birleştirebilirsiniz. Ancak bu sonuçlar varlık değildir. (Daha fazla bilgi için bkz. LINQ to SQL Nesne Modeli). Varlıklar, kimliği olan ve değiştirebileceğiniz nesnelerdir, ancak bu sonuçlar değiştirilemeyen ve kalıcı hale dönüştürülemeyen projeksiyonlardır. Daha da kötüsü, her müşteri düzleştirilmiş birleştirme çıkışındaki her sipariş için tekrarlanırken çok sayıda yedekli veri alırsınız.

Gerçekten ihtiyacınız olan şey, aynı anda bir dizi ilgili nesneyi almak için bir yoldur. Küme, bir grafiğin çizgili bir bölümüdür, böylece amaçladığınız kullanım için gerekenden daha fazlasını veya daha azını asla almayabilirsiniz. Bu amaçla LINQ to SQL, nesne modelinizin bir bölgesinin hemen yüklenmesini sağlar DataLoadOptions . Yöntemler şunlardır:

  • LoadWith yöntemi, ana hedefle ilgili verileri hemen yüklemek için.

  • AssociateWith Belirli bir ilişki için alınan nesneleri filtrelemek için yöntemi.

Ayrıca bkz.