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<T>
,然后强制转换为使其更灵活...但是IQueryable<T>
是更好的执行方法,您可以从字面上查询数据库。如果你想要操作集合的能力,我会选择IList<T>
【讨论】:
以上是关于IQueryable 或 IList的主要内容,如果未能解决你的问题,请参考以下文章
OData IEnumerable 或 IQueryable
在 NET.Core 中构建多/单条件搜索功能(IQueryable 或 IEnumerable)