2012-06-21 6 views
6

Mögliche Duplizieren to SQL:
To return IQueryable<T> or not return IQueryable<T>Warum sollte ich IQueryable <T> über Liste <T> in LINQ

ich LINQ to SQL-Repository implementiert haben wie folgt. Die GetAll-Methode stellt eine generische Liste statt IQueryable wieder her. In den meisten Beispielen und Tutorials wird Pit jedoch als IQQueryable zurückgegeben. Was ist der Vorteil, IQueryable zurückzugewinnen?

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


    } 
} 

Business Layer

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


} 
} 

READING

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

Sie sollten diesen Thread sehen und antworten von Marc Gravell http://stackoverflow.com/questions/718624/to-return-iqueryablet-o-not-return-iqueryablet – Habib

+1

Korrekt, Bote zu schließen - 100% Duplikat. – TomTom

Antwort

4

Mit IQueryable LINQ einige zusätzliche Arbeit in DB bewegen lassen durch unterschiedliche SQL-Abfragen zu erstellen. z.B. Wenn Sie etwas wie GetAll().Where(condition) versuchen und List verwenden, werden alle Elemente aus DB abgefragt, und die Bedingung wird auf der Anwendungsseite überprüft. Wenn Sie IQueryable verwenden, kann es in die DB verschoben werden, und die richtigen Elemente werden direkt von dort zurückgegeben.

+1

Eine andere Antwort, die diese Antwort ergänzen kann, ist: http://stackoverflow.com/a/2876655/170386 –

2

IQueryable erweitert IEnumerable. Beide projizieren ihre Daten nicht, bis sie iteriert werden, während IList Objekte alle ihre Daten ziehen und wenn sie zugewiesen werden.

Also ist es eine "Lazy-Load" vs "Eager-Load" Unterscheidung.

+1

Danke für die Informationen. IQueryable ist besser als IEnumerable. IEnumerable wird die ursprüngliche Abfrage in der Datenbank ausführen und dann im Speicher ausfiltern. http://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet/2876655#2876655 – Lijo

1

Weil IList ist - ah - nicht schlau? Hier

we go:

IIF yo uexport IQueryable - auf der Get-Methode es die einzige Methode, die Sie jemals brauchen. Alle Parameter gehen in die IQueryable und WEEE OF DELAYED EXECUTION ENDE IN IHRER SQL LAYER.

Exportieren Sie IList und Sie erhalten alle und dann Filter - im Speicher, die so viel wie eine Perversion von LINQ ist.

Der eigentliche Trick hier ist, dass, wenn ich Ihre Get-Methode und dann .Where, OrderBy, das in die SQL-Anweisung in der Datenbank kommt.

Verwandte Themen