我应该在接口中为List指定IQueryable吗?

时间:2015-04-13 09:04:14

标签: c# interface ienumerable iqueryable

我想知道,在定义我的界面时,对于对象组,我应该更喜欢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吗?

2 个答案:

答案 0 :(得分:2)

IQueryable接口实际上是对尚未执行的实体框架的查询。当您在ToList()上致电First()FirstOrDefault()IQueryable等时,实体框架将构建SQL查询并查询数据库。

另一方面,

IEnumerable只是&#39;只是&#39;集合的枚举器。您可以使用它来过滤集合,但是您可以使用LINQ to Objects。实体框架在这里没有发挥作用。

回答你的问题:这取决于你。如果您希望存储库的客户端能够进一步自定义它们可以执行的查询,那么您应该公开IQueryable,但如果您希望在存储库中完全控制数据库的查询方式,则可以使用{{1} }。

我更喜欢使用IEnumerable,因为这并不会在整个应用程序中泄漏实体框架的使用。存储库负责数据库访问。进行LINQ到EF优化也更容易,因为查询只在存储库中。

答案 1 :(得分:2)

我通常做的是让存储库返回IQueryable。然后在BL中我指定IEnumerableIQueryble。了解IQuerybleIEnumerable之间的主要区别非常重要。

让我们假设您将数据提取到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集合的精彩视频。

相关问题