我正在尝试了解
IEnumerable<>
到底是什么。
我原以为这只是一个接口,表示底层数据结构具有这些方法,例如
First()
等。
但是,我已经测试了 EF 中显示的代码,我本希望在数据库中生成 TOP 查询,就好像它作为
IQueryable
运行一样,但它反而导致它将整个表拉入内存中执行它的操作。
IEnumerable<EntityObject> m = DbContext.GetDbSet<EntityObject>();
var x = m.First();
那么,将某物视为
IEnumerable
是否会强制其以数组或列表或其他方式运行?
.Net IEnumerable 到底是什么?
好吧,您可能知道 IEnumerable 是所有可枚举的非泛型集合的基本接口,例如数组、列表或任何其他实现 IEnumerable 的集合。 IEnumerable 提供的主要功能是能够使用 foreach 循环迭代集合。
将某些东西视为 IEnumerable 是否会强制它进行操作 作为数组或列表或其他什么?
实际上,它强制查询立即执行并将结果加载到内存中。这实际上并没有将其转换为数组或列表,但它确实意味着数据现在位于内存中,并且对其进行的任何进一步操作都在内存中执行,而不是转换为 SQL 查询并在数据库服务器上执行。
这意味着,将
IQueryable<T>
视为 IEnumerable<T>
会强制立即执行并将数据加载到内存中。任何后续操作(例如 Where
、First
、Select
)都在内存中执行。
现在回到您的共享代码片段,为了确保
First()
操作在数据库上而不是在内存中执行,您应该将集合保留为 IQueryable。这样,First()
方法将被转换为带有 TOP 1 子句的 SQL 查询,并且只会从数据库中获取第一个实体。
因此,您可以按如下方式修改代码:
IQueryable<EntityObject> m = DbContext.GetDbSet<EntityObject>();
var x = m.First();
注意:请参阅此官方文档以获取更多示例
什么是 IEnumerable
C# 中的 IEnumerable 是一个接口,定义了一个方法 GetEnumerator,该方法返回 IEnumerator 接口。这允许对集合进行只读访问,然后实现 IEnumerable 的集合可以与 for-each 语句一起使用。
要点