IQueryable<T>相对于IList<T>的优势

3
在C#的数据访问层中,如果我返回IQueryable而不是IList,我将得到什么优势呢?我没有使用Entity Framework/NHibernate,只是使用普通的ADO.Net...

返回一个 IList<T> 而不是 IQueryable<T> 有什么优势? - Anon.
我没有太多使用IQueryable的经验,但是IQueryable在数据访问层中是否只适用于ORM工具呢? - kayak
Linq(例如Linq to SQL)是ORM,而IQueryable是特定于Linq的接口。值得注意的是,IList是mscorlib的一部分,这是一个特定于Windows的程序集,而Linq程序集则不是。 - Rich Bianco
有时我会把IQueryable想象成强化版的ODBC——这是一个很大的概括,但它帮助我理解了。Linq太神奇了。使用Linq,你可以查询SQL Server、Oracle、内存中的对象列表、XML文件,对调用者来说没有任何区别。在旧时代,如果你有一份员工数据列表存在内存中,并且想要每个部门薪资最高的前5名;在Linq(IQueryable)之前,你可能需要遍历整个集合,比较薪资和部门与目前为止的最高值,但现在你只需编写一个Linq语句并获取一个IQueryable结果即可。 - Rich Bianco
3个回答

1
我相信返回IQueryable允许延迟枚举,而返回IList则不行。
如果您返回一个IList,则对数据库的查询在DAL返回IList时执行。返回一个IQueryable,可以传递返回值,并且仅在检查IQueryable的内容时才执行查询。
(这是基于我使用LINQ到SQL的经验,但我没有根据权威来源进行验证)

在我的数据访问层(DAL)中,我有明确的对数据库的调用,因此不会有任何延迟加载。我认为我们不应该在自定义的基于ADO.Net的DAL中使用IQueryable。 - kayak
我不会从DAL返回IQueryable,但在DAL内部使用它时不会犹豫(以允许多个接口函数使用共同的基本查询,然后在那里进行过滤)。 - Grhm

1

您可以继续针对IQueryable进行查询。IQueryable不是您最终的返回类型,而是用于构建原始查询的私有帮助程序,这些帮助程序是可重用的、可组合的查询片段,其预期返回类型为IQueryable<>中基础类型的返回类型。


-1
你应该返回一个IEnumerable而不是IList或IQueryable:
IQueryable会让调用者认为他们可以使用惰性评估和添加过滤器、排序、投影等功能。
IList允许调用者添加、删除、反转、设置值和修改返回的集合。这对你可能不是问题,但如果你计划在调用之间共享数据,那么你需要注意这一点。
IEnumerable为调用者提供了一个不可变的集合,他们知道它不支持惰性评估。

1
实际上,我使用的大多数IEnumerables都是惰性的。 - VVS
是的,我并不是指惰性求值。我想说的是,IQueryable可以在远程执行工作(例如在数据库中),而IEnumerable则不行。 - tster
1
当然可以。你无法知道在 IEnumerator.MoveNext() 中会发生什么。 - VVS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接