2013-08-16 9 views
5

yapar. ASP.NET MVC 4 ve Entity Framework 6 (Kod) kullanıyorum İlk) ve istemiyorum bazı garip davranışlar:
Bir IsDeleted boolean özelliğine sahip bir Images varlık sınıfım var ve şimdi ilk 25 görüntüyü siliyorum, silinmemiş, aşağıdakileri kullandım kod: Bu gibi.Where (i =>! I.IsDeleted) SQL'e çevirmez ama .Where (i => i.IsDeleted.Equals (false)),

IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25); 

ben biraz daha derin araştırılması çok yavaş ve Where(i => !i.IsDeleted) zaten DB sorgusu tetikler ve tüm görüntüleri yüklenir (ve => yavaş çözümlenir) ve çek ardından" olur ki, öğrendim kod". Daha sonra gayet iyi çalışan Where(i => i.IsDeleted.Equals(false))'u denedim.

İlk sözdizimini daha çok beğendiğim için neden böyle bir sorunu veya bu sorunu nasıl önleyebilirim?
Bu bir hata uf EF 6 beta mıdır, yoksa EF sürümlerinde mi gerçekleşiyor?

GÜNCELLEME:
sorun IEnumerable<Image> için dökme (ben değil benim kodunda aynı çizgide Where yaptı ama basitlik için burada değişti), ama kullanarak .OrderBy(...).ThenBy(...) yapmak da bu kullanıyorum Func<T, TKey> -tuşlarına ve bu IOrderedEnumerable değil IOrderedQueryable dönmek yok ...

GÜNCELLEME 2: Expression<Func<T, TKey>> tuşlarını kullanarak çözüldü ...

+1

Hrm. Bu meraklı. Peki ya Nerede (i => i.IsDeleted == false)? – Tim

+0

@Tim: "! I.IsDeleted" ile aynı, ama IEnumerable 've 'Where' (" Eşittir "inline inline" değil, "!' "Için örtülü kalmam olabilir. sonraki satırda ") - araştırıyorum ... – ChrFin

+2

@chrfin OK, işte sebep bu. IEnumerable item = db.Images; '' IQueryable' işlevini kullanarak, çift satırlarda sorgu oluşturmak ve gerçekten istediğiniz kadar çalıştırılamamak için veritabanından belleğe tüm öğeleri alırsınız. – MarcinJuraszek

cevap

0

T Sorun şu ki, IEnumerable'u kullandığınız anda sorgu çalıştırılacak ve aşağıdaki sorgulamalar LINQ olarak nesnelerin sorguları olacak. Bu soruya izin

Benim hatam sorguları aşağıdaki şekilde test olmasıydı:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false)); 

ve Yani ilk durumda Where hala IQueryable karşı idam edildi

IEnumerable<Image> items = db.Images; 
images = images.Where(i => !i.IsDeleted); 

, ama ikinci durumda IEnumerable'a karşı.

Sonraları OrderBy için ve IQueryable sen Expression<Func<T, K>> parametreleri gerektiğini bir sorunla karşı karşıya ve ben Expression<Func<T, IComperable>> kullanılır, ancak örneğin Func<T, int>, Entity Framework tarafından Func<T, IComperable>'a dönüştürülemiyor.
Bu sorunun nasıl üstesinden gelineceğini öğrenmek için diğer soruma bakın HERE

İlgili konular