2013-03-21 26 views
12

EF (dll sürüm 4.4) kullanıyorumken EF'deki büyük oluşturulmuş SQL sorgularını nasıl önleyebilirim. Veri tabanı, ders bilgileri içeren birkaç tablo içerir. Gerçekte db'ye gönderilen bir görüntüye baktığımda, neredeyse 1300 satırlık bir SQL sorgusu görüyorum (burada büyüklüğü nedeniyle buraya yapıştırmayacağım).Bir veritabanına karşı sorgulamak için Include()

entities.Plans 
    .Include("program") 
    .Include("program.offers") 
    .Include("program.fees") 
    .Include("program.intakes") 
    .Include("program.requirements") 
    .Include("program.codes") 
    .Include("focuses") 
    .Include("codes") 
    .Include("exceptions") 
    .Include("requirements") 
where plans.Code == planCode 
select plans).SingleOrDefault(); 

ben ilgili tabloların her birinden bilgi toplarken sunucuya geri dönmek zorunda kalmamak istiyorum ama bu kadar büyük sorgusu ile ben merak ediyorum: Ben bağlama koşuyorum sorgu benziyor Bunu yapmanın daha iyi bir yolu var mı?

Teşekkürler.

+0

Eh, istekli yükleme yapıyorsunuz ve sorgunuz tüm verileri bir kerede almayı deniyor, dolayısıyla neden bu kadar büyük. Orada bir problem olarak tam olarak ne görüyorsun?Diğer seçenek ise, sanal özelliklere sahip tembel yükleme yapmaktır; bu, erişmeye çalıştığınızda EF tarafından arka planda getirilecek, ancak veritabanına gidiş dönüş istemediğinizi belirttiniz. –

+0

Burada benzer bir cevap var http://stackoverflow.com/questions/5521749/how-many-include-i-can-use-on-objectset-in-entityframework-to-retain-performance –

+0

Sanırım buna doğru bakıp bakmadığımı merak ediyorum. Bir çok küçük sorguya karşı birkaç küçük sorgunun veya bunu yapmanın daha iyi bir yolunun olup olmadığı. – b3n

cevap

0

Genellikle, bu maddenin ardından .Include()'u ekleyebilirsiniz. Bu, yalnızca istediğiniz şeyle eşleşen bilgileri çıkarmanız, sorgunuzu herhangi bir şekilde azaltıp azaltmadığı anlamına gelir.

+1

Bu bir fark yaratmıyor. Sorguyu LINQPad'de çalıştırdım ve oluşturulan SQL her iki durumda da aynı. – b3n

+0

'' 'where cümlesi ve hala aynıydı? Garip görünüyor ... Önerebileceğim başka bir şey navigasyon özelliklerini denemek, biraz farklı çalıştığına inanıyorum, ama dürüstçe onları tam olarak anlamadım. Alternatif olarak, süzgeç/nerede yan tümcesini kullanarak, planlar tablosundan bilgileri alabilirsiniz. Daha sonra ihtiyacınız olanı almak için birkaç katılma deyimi çalıştırın. Kod oldukça kısa değil, ama işleri hızlandırmalı. – Trent

0

İstenilen yüklemeleri gerçekleştirirken, bu nedenle iyi bir yüklemeyi gerçekleştiriyorsanız, o zaman bunun için para cezası verilir. Aksi takdirde Lazy Loading ile gidebilir, ancak veritabanı gidiş gelişini istemediğinizi belirttiğiniz için bundan kaçınabilirsiniz.

Öneririm, Bu sorgu birden çok kez kullanılırsa, derlenmiş sorguyu kullanabilirsiniz. Böylece performansı arttıracak. Bu bağlantı üzerinden

Git İstersen .. http://msdn.microsoft.com/en-us/library/bb896297.aspx

0

Eğer DbContext kullanıyorsanız, size varlık zaten alınır ve bu nedenle bağlam bağlıysa bakmak için bağlama .Local özelliğini kullanabilirsiniz . Sorgu önce kaçmış ve kök Plan kişiler zaten muhtemelen alt kişiler hakkında da zaten bu yüzden girmeyecektir navigasyon özellikleri aracılığıyla onlara atıfta hevesli yükleme yaptım beri bağlandıkları Plan.Code == planId dayalı tespit edilmelidir ise

Bu bağlamın ömrü boyunca yeniden onlar için DB.

Bu article, .Local kullanımında yardımcı olabilir.

0

Sen sizin başvurulan varlıkları geri çekmek için Include projeksiyon kullanılarak yerine bir hafifçe daha özlü SQL sorgusu almak mümkün olabilir: Eğer bağlamda bu tür üzerindeki tembel yüklenmesini devre dışı bırakırsanız

var planAggregate = 
(from plan in entities.Plans 
    let program = plan.Program 
    let offers = program.Offers 
    let fees = program.Fees 
    //... 
    where plan.Code == planCode 
    select new { 
    plan 
    program, 
    offers, 
    fees, 
    //... 
    }) 
    .SingleOrDefault(); 

Sorgu, varlığınızın gezinme özelliklerinin, sorgunuza dahil edilen varlıklar ile doldurulmasına neden olur.

(Bunu yalnızca EF.dll v5.0 üzerinde test ettim, ancak .NET 4.0'da yalnızca EF5 olan EF.dll v4.4'de aynı davranmalıdır. Bu modeli kullanarak test ettiğimde Include, benzer şekilde sorgulanmış bir sorguda, 500 satırlık SQL satırından yaklaşık 70 satır kesildi. Aralığınız değişebilir.)

1

Biraz geç, ancak verileriniz yalnızca günde bir kez değiştikçe, ihtiyacınız olan herşeyi indekslenmiş bir görünüm ve bu görünümü EF modelinize yerleştirin.