8

可能重复:
返回 IQueryable<T> 或不返回 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. 为每个对象创建通用存储库与特定存储库的优势?
4

3 回答 3

6

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

于 2012-06-21T06:26:26.577 回答
3

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

所以这是“延迟加载”与“急切加载”的区别。

于 2012-06-21T06:26:26.597 回答
1

因为 IList 是 - 啊 - 不聪明?

开始了:

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

导出 IList,然后 GET ALL 然后过滤 - 在内存中,这与 LINQ 的变态一样多。

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

于 2012-06-21T06:27:31.427 回答