.NET IEnumerable 到底是什么?

问题描述 投票:0回答:2

我正在尝试了解

IEnumerable<>
到底是什么。

我原以为这只是一个接口,表示底层数据结构具有这些方法,例如

First()
等。

但是,我已经测试了 EF 中显示的代码,我本希望在数据库中生成 TOP 查询,就好像它作为

IQueryable
运行一样,但它反而导致它将整个表拉入内存中执行它的操作。

 IEnumerable<EntityObject> m = DbContext.GetDbSet<EntityObject>();
 var x = m.First();

那么,将某物视为

IEnumerable
是否会强制其以数组或列表或其他方式运行?

c# .net entity-framework
2个回答
0
投票

.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();

注意:参阅此官方文档以获取更多示例


0
投票

什么是 IEnumerable

C# 中的 IEnumerable 是一个接口,定义了一个方法 GetEnumerator,该方法返回 IEnumerator 接口。这允许对集合进行只读访问,然后实现 IEnumerable 的集合可以与 for-each 语句一起使用。

要点

  • IEnumerable 接口包含 System.Collections.Generic 命名空间。

  • IEnumerable 接口是一个通用接口,允许循环通用或非通用列表。

  • IEnumerable 接口也适用于 linq 查询表达式。

  • IEnumerable 接口 返回一个迭代器 收藏。

© www.soinside.com 2019 - 2024. All rights reserved.