Omi*_*imi 3 .net c# foreach linq-to-entities entity-framework
我有这样的代码:
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)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
以下哪种情况是正确的?
Persons应用程序通过对数据库的一次请求从表中获取整个记录,然后从内存中访问每条记录。foreach,应用程序仅从数据库中获取一条记录。以下哪种情况是正确的?
- 应用程序通过对数据库的一次请求从 Persons 表中获取整个记录,然后从内存中访问每条记录。
- 在 foreach 循环的每一步中,应用程序仅从数据库中获取一条记录。
这些说法都不完全正确。但首先,我要说的是,在您的代码中.AsEnumerable()实际上并没有执行任何操作。您可以删除它,而无需从逻辑上更改任何内容。在幕后IQueryable实现IEnumerable并foreach执行IEnumerable方法。所以它解决了IQueryable“可枚举”的问题。
现在进入阅读部分。从应用程序的角度来看,第二种说法最接近事实。persons它一一接收所有实体。在循环结束之前,所有内容都已persons可用。
但实际的较低级别的读取是分块进行的。如此处所述,客户端将数据库中的原始数据存储在网络缓冲区中。根据这些缓冲区的大小和结果集的大小(即 的数量和大小persons),可能会一次读取所有记录。“大量”数据将需要多次读取。
对于应用程序来说,这并不重要。当谈到性能优化时,我认为我们最不应该想到的是网络缓冲区大小。因此,更正确地重写第二个语句:
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |