2015-11-18 26 views
7

içinde yer almıyor. Şu anda C# 4.0'da EntityFramework 6.0 ile bir uygulama oluşturuyorum.SQL sorgusu

Veritabanından bir öğe listesi almaya çalışıyorum ancak sorun, EF çerçevesi tarafından oluşturulan SQL sorgusunun nereye koymuyor olmasıdır.

Yani, tüm tablo/görünüm belleğe yüklenir ve yalnızca 2 veya 3 öğe almak yaklaşık 10 saniye sürer. Aşağıda

, benim GenericRepostitory gelen yöntemi:

public IList<TEntity> GetList(Func<TEntity, bool> where, params Expression<Func<TEntity, object>>[] navigationProperties) 
{ 
    using (var dbContextScope = contextScopeFactory.CreateReadOnly()) 
    { 
     IQueryable<TEntity> dbQuery = Context.Set<TEntity>().AsQueryable(); 

     foreach (Expression<Func<TEntity, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include<TEntity, object>(navigationProperty); 

     var list = dbQuery 
      .AsNoTracking() 
      .Where(where); 

     Context.Database.Log = s => Debug.WriteLine(s); 

     return list.ToList<TEntity>(); 
    } 
} 

Ve böyle diyoruz:

var repository = repositoryFactory.Get<Context, Entity>(); 
var items = repository.GetList(x => x.FakeID <= 10); 

dönüş sonuç iyi ama yaklaşık 10 saniye alınmasını sürer. Ve hata ayıklama oluşturulan SQL sorgusunu yazdığında, nerede yan tümcesi hiçbir yerde

BulList işlevimi, nerede eklediğinizi içerecek şekilde nasıl değiştirebilirim?

Umarım bu bilgilerle yeterince açıkım ve ingilizcem için özür dilerim. Benim anadil değil: Neyse/

teşekkür ediyoruz Yardımlarınız için

+1

' Context.Set () .AsQueryable() gerek '? 'AsQueryable' burada gerekli olmamalı. –

+0

Evet yapmamalı, kaldırdım. Çünkü bu problemle bir kaç saat uğraştım ve çok farklı şeyler denedim ... – Mica

cevap

7
Hala ile diyebilirsin

GetList(Func<TEntity, bool> where, ... 

den

GetList(Expression<Func<TEntity, bool>> where, ... 

için yöntem imzası değiştirin

lambda, şimdi senin gibi. Where, veritabanından okunan tam liste üzerinde "linq-to-objects" olarak kullanıldı. İfade EF ile gerekli sql oluşturmak için okuyabilirsiniz.

+0

Teşekkürler, işe yarıyor! :) – Mica

7

where parametresinin türü çok

dbQuery.Where(where) 

filtrelemeden önce belleğe veri yükleme, Enumerable.Where uzantısı yöntemi kullanan, Func<TEntity, bool> olup. `Bir` DBContext Context` değilse nedir `; sen (SQL çevrilir) Queryable.Where yöntemi kullanmak istiyorsanız bir Expression<Func<TEntity, bool>> parametreyi

public IList<TEntity> GetList(Expression<Func<TEntity, bool>> where, 
           params Expression<Func<TEntity, object>>[] navigationProperties) 
+0

Size ve açıklamanıza teşekkür ederiz. Şimdi farkı daha iyi anladım! :) – Mica