我有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;
}
}
}
阅读
答案 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语句。