2012-06-21 20 views
6

Duplicar posible:
To return IQueryable<T> or not return IQueryable<T>Por qué debería utilizar IQueryable <T> sobre la lista <T> en LINQ to SQL

tengo LINQ a SQL repositorio implementado de la siguiente manera. El método GetAll está redefiniendo una lista genérica en lugar de IQueryable. Sin embargo, en la mayoría de los ejemplos y tutoriales, pit muestra que devuelve IQueryable. ¿Cuál es la ventaja de retomar IQueryable?

using System.Linq; 
namespace RepositoryLayer 
{ 
public interface IRepository<T> where T : class 
{ 
    //System.Linq.IQueryable<T> GetAll(); 
    System.Collections.Generic.List<T> GetAll(); 
} 

public class Repository<T> : IRepository<T> where T : class 
{ 
    public System.Data.Linq.DataContext Context 
    { 
     get; 
     set; 
    } 

    //public virtual System.Linq.IQueryable<T> GetAll() 
    //{ 
    // //GetAll is returning generic Queryable<T>. 
    // System.Linq.IQueryable<T> allItems = Context.GetTable<T>(); 
    // return allItems; 
    //} 

    public virtual System.Collections.Generic.List<T> GetAll() 
    { 

     System.Linq.IQueryable<T> allItems = Context.GetTable<T>(); 
     return allItems.ToList(); 
    } 


    } 
} 

Capa de negocios

namespace BusinessLayerProject 
{ 
public class AccountBusiness 
{ 
    //IRepository<T> 
    RepositoryLayer.IRepository<RepositoryLayer.Account> accountRepository; 
    public AccountBusiness(RepositoryLayer.IRepository<RepositoryLayer.Account> repo) 
    { 
     accountRepository = repo; 
    } 

    //public List<RepositoryLayer.Account> GetAllAccounts() 
    //{ 

    // //LibraryManagementClassesDataContext context = new LibraryManagementClassesDataContext(); 
    // //List<RepositoryLayer.Account> accontList = context.Accounts.ToList(); 

    // System.Linq.IQueryable<RepositoryLayer.Account> acc = accountRepository.GetAll(); 
    // return acc.ToList(); 
    //} 

    public List<RepositoryLayer.Account> GetAllAccounts() 
    { 
     List<RepositoryLayer.Account> acc = accountRepository.GetAll(); 
     return acc; 
    } 


} 
} 

LECTURA

  1. Advantage of creating a generic repository vs. specific repository for each object?
+1

Debería ver este hilo y la respuesta de Marc Gravell http://stackoverflow.com/questions/718624/to-return-iqueryablet-or-not-return-iqueryablet – Habib

+1

Correcto, bote para cerrar - 100% duplicado. – TomTom

Respuesta

4

Usando IQueryable vamos LINQ mover un poco de trabajo adicional en DB mediante la creación de diferentes consultas SQL. p.ej. cuando intente algo como GetAll().Where(condition) y use List, todos los elementos se consultan desde la base de datos y donde se comprueba la condición de la aplicación. Cuando usa IQueryable, puede moverse a la base de datos y los elementos adecuados son retornadores directamente desde allí.

+1

Otra respuesta que puede complementar esta respuesta es: http://stackoverflow.com/a/2876655/170386 –

2

IQueryable extiende IEnumerable. Ambos no proyectan/inflan sus datos hasta que se iteran, mientras que los objetos IList extraen todos sus datos y se completan cuando se les asigna.

Por lo tanto, es una distinción de "carga lenta" frente a "carga ansiosa".

+1

Gracias por la información. IQueryable es mejor que IEnumerable. IEnumerable ejecutará la consulta original en la base de datos, luego filtrará en la memoria. http://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet/2876655#2876655 – Lijo

1

Becasue IList es - ah - no es inteligente?

Aquí vamos:

IIF yo uexport IQueryable - en el método de conseguirlo es el único método alguna vez necesita. Todos los parámetros van a IQueryable y PORQUE LA EJECUCIÓN DEMORADA TERMINA EN SU CAPA DE SQL.

Exportar IList y usted GET ALL y THEN filter - en la memoria, que es tanto una perversión de LINQ como se pone.

El truco real aquí es que si hago clic en su método Get y luego .Where, OrderBy, que entra en la declaración sql en la base de datos.

Cuestiones relacionadas