gpt4 book ai didi

c# - 当我的 LINQ 查询将数据库记录作为 Enumerable 获取并在 foreach 循环中访问记录时会发生什么?

转载 作者:行者123 更新时间:2023-12-03 23:08:08 24 4
gpt4 key购买 nike

我有这样的代码:

public class Database : System.Data.Entity.DbContext
{
public DbSet<Person> Persons { get; set; }
}

var db = new Database();
var persons = db.Persons.Where(...).AsEnumerable();
foreach(var person in persons)
{
//...
}

以下哪种情况是正确的?

  • 应用程序通过对数据库的一次请求从 Persons 表中获取整条记录,然后从内存中访问每条记录。
  • foreach循环的每一步中,应用程序只从数据库中获取一条记录。

最佳答案

Which of the following scenarios is correct?

  • Application fetches entire records from Persons table by one request to database, then access each record from memory.
  • In each step of foreach loop, application fetches only one record from database.

这些说法都不完全正确。但首先,让我说在你的代码中 .AsEnumerable() 实际上并没有做任何事情。您可以删除它而无需从逻辑上更改任何内容。 IQueryable 实现了 IEnumerableforeach executes IEnumerable methods under the hood .因此它将 IQueryable 定位为“可枚举”。

现在是阅读部分。从应用程序的角度来看,第二种说法最接近事实。它一一接收 persons 中的所有实体。不是在循环结束之前,所有 person 都可用。

但实际的低层次阅读是分块进行的。如所述here ,客户端将来自数据库的原始数据存储在网络缓冲区中。根据这些缓冲区的大小和结果集的大小(即 persons 的数量和大小), 有可能一次读取所有记录。 “大量”数据将需要多次读取。

但对于应用程序而言,这并不重要。当谈到性能优化时,我认为我们应该想到的最后一件事就是玩弄网络缓冲区大小。因此,为了更正确地改写第二个陈述:

  • 在 foreach 循环的每一步中,只有一条记录从数据库发送到应用程序的范围。

关于c# - 当我的 LINQ 查询将数据库记录作为 Enumerable 获取并在 foreach 循环中访问记录时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com