Aracılığıyla paylaş


Ertelenmiş ve Anında 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ı mutlaka gerektiğinde ertelemek için ertelenen yükleme yöntemini kullanabilirsiniz. Aşağıdaki örneği göz önünde bulundurun:

    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üşteri ve sipariş verilerini aynı anda görüntülemesi 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ü, düzleştirilen birleştirme işlemi sonucu her sipariş için her müşteri tekrarlanarak gereksiz yere çok fazla 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.

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

Ayrıca bakınız