2012-09-13 13 views
5

Tengo algunos problemas con una consulta lenta en Entity Framework en C#. Creé un método de extensión llamado Página para manejar la paginación, pero cuando lo uso, la consulta se vuelve realmente lenta. Si acabo de hacer .Skip (page.Value * pageSize.Value) .Take (pageSize.Value) en lugar de usar Page la consulta se vuelve mucho más rápida. Supongo que hacerlo con Page busca todos los contactos antes de la búsqueda. ¿Hay alguna manera de prevenir esto o estoy haciendo algo diferente?¿La paginación de la estructura de entidad con el método de extensión es lenta?

Consulta: método

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

Extensión:

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

Respuesta

9

Su método de extensión debe ser mayor de IQueryable por lo que EF puede procesar la expresión y generar la consulta SQL con paginación.

Dado que usa IEnumerable, el método de página invocará Saltar y tomar de IEnumerable. Esto causará la enumeración del resultado de la consulta que se creó hasta ese punto (antes de la llamada a la página) y realizará la paginación en la memoria, sobre todos los elementos devueltos, en lugar de incluir la paginación en la consulta DB.

Cuestiones relacionadas