2015-11-18 16 views
7

Attualmente sto creando un'applicazione in C# 4.0 con EntityFramework 6.0.Clausola Where non inclusa nella query SQL

Sto cercando di recuperare un elenco di elementi dal database ma il problema è che la query SQL generata dal framework EF non include la clausola where.

Così, l'intera tabella/vista viene caricata in memoria e ci vogliono circa 10 secondi per ottenere solo 2 o 3 elementi.

Di seguito, il metodo della mia GenericRepostitory:

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>(); 
    } 
} 

E mi chiamano così:

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

Il risultato restituito è buona, ma ci vogliono circa 10 secondi per essere recuperati. E quando il debug scrive la query SQL generata, la clausola where non è in nessun punto

Come posso modificare la mia funzione GetList per includere la clausola where?

Spero di essere stato abbastanza chiaro con queste informazioni e mi dispiace per il mio inglese. Non è la mia lingua madre:/

In ogni caso, ringraziare il vostro per il vostro aiuto

+1

'Context.Set () .AsQueryable();' 'Qual è Context' se non un' DbContext '? 'AsQueryable' non dovrebbe essere necessario qui. –

+0

Sì, non dovrebbe, l'ho rimosso. È perché sono rimasto bloccato con questo problema da poche ore e ho provato molte cose diverse ... – Mica

risposta

7

cambiate la vostra firma metodo dal

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

a

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

Si può ancora chiamare con un lambda, come fai adesso. Il Where è stato utilizzato come "linq-to-objects", sull'elenco completo letto dal database. Con l'espressione EF puoi leggerlo per generare lo sql necessario.

+0

Grazie, funziona! :) – Mica

7

Il tipo di parametro where è Func<TEntity, bool>, così

dbQuery.Where(where) 

utilizza il metodo Enumerable.Where estensione, il caricamento dei dati nella memoria prima della filtrazione. Se si desidera utilizzare il metodo Queryable.Where (che sarà tradotto in SQL) è necessario un parametro Expression<Func<TEntity, bool>>

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

Grazie a te e alla tua spiegazione. Capisco meglio la differenza ora! :) – Mica