2012-09-13 10 views
5

Ho alcuni problemi con una query lenta in Entity Framework in C#. Ho creato un metodo di estensione chiamato Pagina per gestire il paging, ma quando lo uso la query diventa molto lenta. Se faccio solo .Skip (page.Value * pageSize.Value) .Take (pageSize.Value) invece di usare Page la query diventa molto più veloce. Immagino che farlo con Page recupera tutti i contatti prima del paging. C'è un modo per prevenire questo o sto facendo qualcos'altro di sbagliato?Il paging del framework di entità con il metodo di estensione è lento?

Query: metodo

var contacts = db.Contacts 
         .Where(x => x.AccountID == accountID && x.Deleted == false) 
         .OrderByDescending(x => x.FirstName) 
         .ThenBy(x => x.LastName) 
         .ThenBy(x => x.CreatedDate) 
         .Page(page, pageSize); 

return contacts.ToList(); 

Estensione:

public static IEnumerable<T> Page<T>(this IEnumerable<T> elements, int? page, int? pageSize) 
    { 
     if (page.HasValue && pageSize.HasValue) 
      return elements.Skip(page.Value * pageSize.Value).Take(pageSize.Value); 
     else 
      return elements; 
    } 

risposta

9

tuo metodo di estensione dovrebbe essere sopra IQueryable in modo che EF in grado di elaborare l'espressione e generare la query SQL con impaginazione.

Dal momento che si utilizza IEnumerable, il metodo Page invoca Skip e Take di IEnumerable. Ciò causerà l'enumerazione del risultato della query che è stata creata fino a quel punto (prima della chiamata a Page) e rende l'impaginazione in memoria, su tutti gli elementi restituiti, invece di includere l'impaginazione nella query DB.

Problemi correlati