为什么我应该在LINQ to SQL中使用IQueryable <t>而不是List <t> </t> </t>

时间:2012-06-21 06:23:07

标签: c# .net design-patterns linq-to-sql repository-pattern

  

可能重复:
  To return IQueryable<T> or not return IQueryable<T>

我有LINQ to SQL存储库实现如下。 GetAll方法正在返回通用List而不是IQueryable。但是,在大多数示例和教程中,pit显示为返回IQueryable。回归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();
    }


  }
}

业务层

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


 }
}

阅读

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

3 个答案:

答案 0 :(得分:6)

使用IQueryable让LINQ通过创建不同的SQL查询将一些额外的工作转移到DB中。例如。当您尝试GetAll().Where(condition)之类的内容并使用List时,将从DB查询所有项目,并在应用程序端检查条件。当您使用IQueryable时,它可以移动到数据库,并且正确的项目将直接从那里返回。

答案 1 :(得分:2)

IQueryable延伸IEnumerable。两者都不会在迭代之前投射/膨胀他们的数据,而IList个对象会提取所有数据并在分配时填充。

所以这是一种“懒惰”与“渴望加载”的区别。

答案 2 :(得分:1)

Becasue IList是 - 啊 - 不聪明?

我们走了:

IIF yo uexport IQueryable - 在Get方法上,它是您需要的唯一方法。所有参数都进入IQueryable,并且因为SQL层中的延迟执行结束。

导出IList,你得到所有,然后过滤 - 在内存中,这与LINQ的变态一样多。

这里的真正诀窍是,如果我使用Get方法,然后使用.Where,OrderBy,它将进入数据库中的sql语句。