IQueryable 或 IList

Posted

技术标签:

【中文标题】IQueryable 或 IList【英文标题】:IQueryable or IList 【发布时间】:2012-10-20 08:47:24 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

Returning IEnumerable<T> vs. IQueryable<T> 和 What is the difference between IQueryable<T> and IEnumerable<T>?

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于IQueryable 或 IList的主要内容,如果未能解决你的问题,请参考以下文章

OData IEnumerable 或 IQueryable

在 NET.Core 中构建多/单条件搜索功能(IQueryable 或 IEnumerable)

如何将 IEnumerable<t> 或 IQueryable<t> 转换为 EntitySet<t>?

IEnumerable 和 IQueryable

为啥我不能像使用列表一样过滤 IQueryable?

运行 IQueryable.First() 时的性能问题