gpt4 book ai didi

c# - LINQ 是将 SQL Server 中的所有项目加载到内存中还是仅加载到 block 中?

转载 作者:行者123 更新时间:2023-11-30 17:09:21 25 4
gpt4 key购买 nike

我想知道 LINQ 和 SqlDataProvider 是否设法遍历整个表。

对于下面的例子,

  • 是否将整个 foo 项一次性加载到内存中并进行 CLR遍历内存中的 foo 项?

  • 或者 foo 项是从 SQL Server 分块加载的?

  • 或者它们从 SQL SERVER 加载到 MEMORT 只有一个 foo一次?

  • 还是?

using (var context = new FooEntities())
{
var allItems = from foo in context.Foos
select foo;

// Are all foos LOADED into the MEMORY at once?
// Or they come from SQL SERVER in chunks?
foreach (f in foos)
Console.WriteLine(f.ID);
}

最佳答案

这取决于ORM工具。不清楚,但看起来 FooEntities 是 Entity Framework?

首先,请注意,大多数“完整”ORM 将(默认情况下)将其加载的所有对象附加到身份管理器/更改管理器中,这意味着一旦对象被看到,它们将一直存在ORM 实例(尽管有时有禁用它的方法)。

其次,请注意,.Foos 之类的结果通常是一个“实体集”或类似的,一个完全加载的数据集;但同样,这不是必然

基本上,它取决于许多不在问题中的细节。然而,通常有一些 API 可以加载非缓冲(假脱机)数据并且不附加到变更管理器/身份管理器。例如,LINQ-to-SQL 具有 ObjectTrackingEnabled 和一些其他开关。

如果您只是想要一个可以懒惰地处理数据、将行具体化为对象的工具,那么 dapper可能有用:

foreach(EntityType row in connection.Query<EntityType>(
"select * from TableName", buffered: false))
{
// fully streaming, no identity manager
Console.WriteLine(row.Id);
// ...etc
}

关于c# - LINQ 是将 SQL Server 中的所有项目加载到内存中还是仅加载到 block 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13011808/

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