gpt4 book ai didi

c# - 使用 forEach 迭代 IQueryable 与调用 ToList() 然后执行 forEach - 性能

转载 作者:行者123 更新时间:2023-12-01 15:01:36 26 4
gpt4 key购买 nike

我一直在看一门类(class),作者提到如果你有一些 IQueryable , 说:

var someQuery = dbContext.Table.Where(x => x.Name == "Mark");
然后尝试迭代 someQuery 的结果使用 foreach ,它使数据库连接保持打开状态,直到整个 foreach结束了,很多初学者都会犯这个错误,在 foreach 中做了大量的逻辑。 .相反,她建议直接调用 ToList()预先,然后做 foreach在内存集合上。
我找不到任何关于此的引用, Entity Framework 保持数据库打开,直到 foreach循环停止。我如何评估这是否是真正的性能方面?

最佳答案

ToList()应用于 IQueryable<T> 的方法是您可以在 System.core.dll 中使用 .NET 反编译器看到的扩展方法;
如果源是 ICollection<T>,则该方法复制“私有(private)数组”。 ,否则它从源执行一个 foreach 循环。

一个IQueryable<T>的真正实现是 System.Data.Entity.Infrastructure.DbQuery<TResult>它不是 ICollection<T> .

所以,ToList()基本上使用 foreach 复制源代码.

现在,这取决于实现,但以 EF 核心为例,有一个 Enumerator class您可以在其中看到连接( IRelationalConnection )在处理类时关闭。
根据另一个 answer , 和毫秒 documentation ,您应该尽快关闭连接以释放连接并使其在连接池中可用。

A connection pool is created for each unique connection string. When a pool is created, multiple connection objects are created and added to the pool so that the minimum pool size requirement is satisfied. Connections are added to the pool as needed, up to the maximum pool size specified (100 is the default). Connections are released back into the pool when they are closed or disposed.



因此,如果您正在执行复杂的操作或执行其他查询或 foreach 内的任何其他内容,则首选 ToList。

关于c# - 使用 forEach 迭代 IQueryable 与调用 ToList() 然后执行 forEach - 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37744861/

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