4

我正在查询数据库并从中生成对象列表。

通常从我的业务层我返回这个 IList 类型缓存的对象列表。如果我将其更改为返回 IQueryable,这样做有什么好处?IQueryable 给了我什么 IList 没有?

4

4 回答 4

6

IQueryable是一个用于查询数据库的接口,它定义了允许实现者做一些简洁的事情的功能,比如延迟执行和构建更优化的查询(通过评估表达式树)。IList 没有给你这些。

此外,IQueryable (在大多数情况下)是一个只读接口。IList 定义了允许用户修改集合的 Add、Remove 等。如果这在语义上对您更有意义,那么一定要使用它,然后使用 IEnumerable Linq 扩展来获得 IQueryable 的大部分功能。

于 2012-10-30T22:59:44.517 回答
1

我喜欢对所有返回类型使用 IEnumerable - 如果它们很简单,我会在返回它的方法中使用 List 来实现它们,或者如果需要,我会使用更专业的具体类来实现它们。优点是,我很少需要更改实现 IEnumerable 的类的客户端。我不在乎它是列表还是哈希表。使用 IList,您会被困在使用列表中。

但是,如果您使用的是 LINQ-to-SQL,或者您正在处理类中的大量数据,则 IQueryable 支持一些 IEnumerable 不支持的方法。IEnumerable 是 ILIst 和 IQueryable 的基本实现,这就是为什么我建议使用它作为大多数函数的返回类型

查看这些文章,了解 IQueryable 和 IEnumerable 之间的区别:

返回 IEnumerable<T> 与 IQueryable<T> 以及 IQueryable<T> 和 IEnumerable<T> 有什么区别?

于 2012-10-30T23:03:16.930 回答
0

如果您打算使用查询数据库,那么我认为 IQueryable 更有用。APrta 从此,您可以使用 IList 从列表中添加、删除、获取特定项目。这完全取决于你想如何使用它。

于 2012-10-30T22:53:41.583 回答
0

您可以返回IEnumerable<T>然后强制转换以使其更灵活......但是IQueryable<T>更好的执行方法是您可以从字面上查询数据库。如果您想要操作集合的能力,我会选择IList<T>

于 2012-10-30T22:55:39.180 回答