with query objects item examples consulta c# .net design-patterns linq-to-sql repository-pattern

query - find in list c# linq



¿Por qué debería usar IQueryable<T> sobre List<T> en LINQ to SQL (3)

Porque IList es - ah - no inteligente?

Aquí vamos:

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

Exporte IList y OBTENGA TODO y ENTONCES filtro - en la memoria, que es tanto una perversión de LINQ como se pone.

El verdadero truco aquí es que si realizo el método Get y luego .Where, OrderBy, eso entra en la declaración sql en la base de datos.

Posible duplicado:
Para devolver IQueryable <T> o no devolver IQueryable <T>

Tengo el repositorio LINQ to SQL 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 empresarial

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

LEYENDO

  1. ¿Ventajas de crear un repositorio genérico frente a un repositorio específico para cada objeto?

Usando IQueryable deje que LINQ mueva algo de trabajo adicional a DB creando diferentes consultas SQL. p.ej. cuando intentas algo como GetAll().Where(condition) y uses List todos los ítems son consultados desde DB y donde la condición es marcada en el lado de la aplicación. Cuando usa IQueryable , puede moverse a DB y los elementos apropiados son retornadores directamente desde allí.


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

Entonces, es una distinción de "carga lenta" versus "carga ansiosa".