LINQ'da Include () ne yapar?


96

Çok fazla araştırma yapmaya çalıştım ama ben daha çok bir db adamıyım - bu nedenle MSDN'deki açıklama bile bana mantıklı gelmiyor. Herhangi biri açıklayabilir ve sorgu Include()teriminde hangi ifadenin işe yaradığı konusunda bazı örnekler SQLverebilir mi?


Çok basit, sadece basit Seç, Nerede, Sırala, bazı toplu işleyicileri bilirim. LINQ veya Include'da JOIN'i denemedim. Nihai hedefim, bu LINQ Sorgularını SQL'de yeniden yazabilmekti
CJ

Yanıtlar:


173

Diyelim ki tüm müşterilerinizin bir listesini almak istiyorsunuz:

var customers = context.Customers.ToList();

Ve birbirlerinin varsayalım Customernesne onun kümesine bir referansı vardır Ordersve her birinin Orderreferansları sahiptir LineItemski aynı zamanda bir referans verebilir Product.

Gördüğünüz gibi, birçok ilgili varlığa sahip üst düzey bir nesnenin seçilmesi, birçok kaynaktan veri çekmesi gereken bir sorguya neden olabilir. Bir performans ölçüsü Include()olarak, aynı sorgunun bir parçası olarak hangi ilgili varlıkların veritabanından okunması gerektiğini belirtmenize olanak tanır.

Aynı örneği kullanarak, bu, ilgili tüm sipariş başlıklarını getirebilir, ancak diğer kayıtların hiçbirini getirmeyebilir:

var customersWithOrderDetail = context.Customers.Include("Orders").ToList();

SQL'i istemenizden sonraki son nokta olarak, ilk ifade olmadan Include()basit bir ifade oluşturabilir:

SELECT * FROM Customers;

Çağıran son ifade Include("Orders")şöyle görünebilir:

SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;

2
Teşekkür ederim. Senin örneği kullanarak, ben de dahil etmek istiyorsanız söyleyebiliriz LineItemsve ProductsLINQ sorgusu aşağıdaki gibi görünmelidir: var customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();?
CJ

2
Evet, Include()farklı "yollar" boyunca nesneleri yakalamak için birden çok çağrıyı zincirleyebilirsiniz . Nesnelerin aynı yolda olmasını istiyorsanız, yalnızca tüm yolu belirten bir arama yapmanız gerekir. Yana LineItemsve Productsayrı aramaları gerekiyor herhangi bir yol bileşenlerini paylaşmıyoruz.
Yuck

Include kullanmak zorunlu mu? Kullanmadan ilgili nesneleri alabileceğim çözümler üzerinde çalıştığımdan oldukça eminim.
Jepzen

@Jepzen Bu, tembel yüklü varlıkları kullanıp kullanmadığınıza bağlıdır.
Yuck

@Yuck, bunun tembel yükleme kullanırken işe yaradığını düşünüyorum, istekli yükleme durumunda "include" ifadesini kullanmanıza gerek yok, ancak bu kesinlikle performans sorunlarına neden olacak. Lütfen beni bu konuda düzeltin.
sam

27

"Dahil et" in istekli yüklemenin bir parçası olduğunu eklemek istedim. Microsoft tarafından Entity Framework 6 öğreticisinde açıklanmıştır. İşte bağlantı: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the -entity-framework-in-an-asp-net-mvc-application


Bağlantılı sayfadan alıntı:

Entity Framework'ün ilgili verileri bir varlığın gezinme özelliklerine yükleyebileceği birkaç yol vardır:

Yavaş yüklenme. Varlık ilk okunduğunda, ilgili veriler alınmaz. Ancak, bir navigasyon özelliğine ilk kez erişmeye çalıştığınızda, o navigasyon özelliği için gerekli olan veriler otomatik olarak alınır. Bu, veritabanına birden çok sorgu gönderilmesine neden olur - biri varlığın kendisi için ve diğeri varlıkla ilgili verilerin alınması gerekir. DbContext sınıfı, varsayılan olarak geç yüklemeyi etkinleştirir.

Hevesli yükleme. Varlık okunduğunda, onunla birlikte ilgili veriler de alınır. Bu genellikle, gerekli olan tüm verileri alan tek bir birleştirme sorgusuyla sonuçlanır. IncludeYöntemi kullanarak istekli yüklemeyi belirtirsiniz .

Açık yükleme. Bu, ilgili verileri kodda açıkça almanız dışında geç yüklemeye benzer; bir navigasyon özelliğine eriştiğinizde otomatik olarak gerçekleşmez. Bir varlık için nesne durum yöneticisi girişini alarak ve koleksiyonlar için Collection.Load yöntemini veya tek bir varlığı tutan özellikler için Reference.Load yöntemini çağırarak ilgili verileri manuel olarak yüklersiniz. (Aşağıdaki örnekte, Yönetici gezinme özelliğini yüklemek isterseniz, Collection(x => x.Courses)ile değiştirirsiniz Reference(x => x.Administrator).) Genellikle, açık yüklemeyi yalnızca geç yüklemeyi kapattığınızda kullanırsınız.

Özellik değerlerini hemen almadıklarından, geç yükleme ve açık yükleme, ertelenmiş yükleme olarak da bilinir.


3
SO = 'a hoş geldiniz) Sadece bir öneri, ancak böyle bir şeyi yanıtlarken, eğer yapabiliyorsanız, bir kod parçacığı ekleyin. Linkler maalesef kapanabilir.
The_Cthulhu_Kid

2

Bunu, alt öğelerin aksi takdirde tembel yükleme yapacağı bir senaryoda Hevesli Yüklemeyi zorlamak olarak düşünün.

Veritabanına gönderilen Sorgu EF ilk başta daha büyük bir sonuç verecektir, ancak erişimde dahil edilen öğelere erişilirken hiçbir takip sorgusu yapılmayacaktır.

Öte yandan, bu olmadan, EF, alt öğelere ilk eriştiğinizde daha sonra separte sorguları yürütür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.