2012-06-21 12 views
6

Powiel możliwe:
To return IQueryable<T> or not return IQueryable<T>Dlaczego należy używać IQueryable <T> ponad Lista <T> w LINQ to SQL

mam LINQ do repozytorium SQL realizowany następująco. Metoda GetAll przechwytuje ogólną listę zamiast IQueryable. Jednak w większości przykładów i tutorialów pojawia się okno, które zwraca IQueryable. Jaka jest zaleta przywracania 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(); 
    } 


    } 
} 

warstwy biznesowej

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


} 
} 

CZYTANIE

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

Powinieneś zobaczyć ten wątek i odpowiedź od Marca Gravell http://stackoverflow.com/questions/718624/to-return-iqueryablet-lub-not-return-iqueryablet – Habib

+1

Prawidłowo, bote to close - 100% duplikatu. – TomTom

Odpowiedz

4

Korzystanie IQueryable pozwolić LINQ przenieść jakąś dodatkową pracę w DB poprzez tworzenie różnych zapytań SQL. na przykład. kiedy próbujesz coś takiego jak GetAll().Where(condition) i używasz List wszystkie elementy są sprawdzane z DB i gdzie warunek jest sprawdzany po stronie aplikacji. Gdy używasz IQueryable, można go przenieść do DB, a odpowiednie elementy są bezpośrednio zwracane.

+1

Inną odpowiedzią, która może uzupełnić tę odpowiedź, jest: http://stackoverflow.com/a/2876655/170386 –

2

Przedłużenie IEnumerable. Oba nie projektują/nie zawyżają danych, dopóki nie zostaną powtórzone, podczas gdy obiekty IList pobierają wszystkie swoje dane i są zapełniane, gdy są przypisane.

Jest to więc rozróżnienie "lazy-load" vs. "eager-load".

+1

Dzięki za informacje. IQueryable jest lepszy niż IElumerable. IEnumerable wykona oryginalne zapytanie w bazie danych, a następnie odfiltrowuje je w pamięci. http://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet/2876655#2876655 – Lijo

1

Becasue IList jest - ah - nie sprytny?

Zaczynamy:

IIF yo uexport IQueryable - na metody GET jest to jedyna metoda potrzebować. Wszystkie parametry idą do IQueryable i PONIEWAŻ OPÓŹNIONE WYKONANIE ZAKOŃCZY SIĘ W SWOJEJ WARUNKACH SQL.

Wyeksportuj ILISTa, a wy GET ALL i THEN filter - w pamięci, który jest tak samo wypaczeniem LINQ, jak to tylko możliwe.

Prawdziwą sztuczką jest to, że jeśli zrobię twoją metodę Get, a następnie .Where, OrderBy, dostanie się do instrukcji sql w bazie danych.

Powiązane problemy