我想知道,在定义我的界面时,对于对象组,我应该更喜欢IQueryable而不是List。或者IEnumerable可能更好,因为IEnumerable类型可以转换为IQueryable以与LINQ一起使用。
我正在网上查看一个课程并且正在处理EntityFramework,因为LINQ使用它最好使用IQueryable(好吧,除此之外还有更多,但现在可能不重要)。 下面的代码被使用了,它让我想到我是否应该为我的对象组指定IQueryable而不是List。
namespace eManager.Domain
{
public interface IDepartmentDataSource
{
IQueryable<Employee> Employees { get; }
IQueryable<Department> Departments { get; }
}
如果我正在为调用存储库以获取Employees的服务构建接口,我通常会指定
List <Employees>
但这是最佳做法吗? IQueryable会为实现我的界面的类提供更大的灵活性吗?如果不需要导入LINQ,那么必须导入LINQ的开销如何(比如说他们只需要一个List)?我应该在这两个上使用IEnumerable吗?
答案 0 :(得分:2)
IQueryable
接口实际上是对尚未执行的实体框架的查询。当您在ToList()
上致电First()
,FirstOrDefault()
或IQueryable
等时,实体框架将构建SQL查询并查询数据库。
IEnumerable
只是&#39;只是&#39;集合的枚举器。您可以使用它来过滤集合,但是您可以使用LINQ to Objects。实体框架在这里没有发挥作用。
回答你的问题:这取决于你。如果您希望存储库的客户端能够进一步自定义它们可以执行的查询,那么您应该公开IQueryable
,但如果您希望在存储库中完全控制数据库的查询方式,则可以使用{{1} }。
我更喜欢使用IEnumerable
,因为这并不会在整个应用程序中泄漏实体框架的使用。存储库负责数据库访问。进行LINQ到EF优化也更容易,因为查询只在存储库中。
答案 1 :(得分:2)
我通常做的是让存储库返回IQueryable
。然后在BL中我指定IEnumerable
或IQueryble
。了解IQueryble
和IEnumerable
之间的主要区别非常重要。
让我们假设您将数据提取到IEnumerable中
IEnumerable employees=this.repository.GetAll();
现在让我们说这个特定功能只需要年龄超过21岁的员工,而其他人则根本不需要。
你会这样做:
employees.Where(a=>a.Age>21)
在这种情况下,原始查询将加载到内存中,然后将应用Where。
现在假设您更改了将数据提取到IQueryable的功能
IQueryable employees=this.repository.GetAll();
employees.Where(a=>a.Age>21)
这次使用Where子句修改查询时,整个查询将在数据库中执行(如果可能),并且您只能从数据库中获得年龄超过21岁的员工。
在IEnumerable案例中,您将从数据库中获取所有员工,然后在内存中过滤它们以满足where条件。
使用IEnumerable,IList还是别的什么? 如果您知道将在集合上执行哪些操作,则可以轻松选择要使用的接口。基本上,如果你只迭代集合,你将使用IEnumerable。如果要执行更多操作,则需要选择适当的界面。有很多关于.NET集合的精彩视频。