ane*_*a20 2 c# linq entity-framework linq-to-sql
我一直在看一门课程,作者提到如果您有一些IQueryable,请说:
var someQuery = dbContext.Table.Where(x => x.Name == "Mark");
Run Code Online (Sandbox Code Playgroud)
然后尝试遍历结果someQuery使用forEach,它会使数据库连接打开,直到整个forEach结束,很多初学者开发者的犯这样的错误,并做吨逻辑的forEach。相反,她建议先调用toList(),然后再进行forEach内存中的收集。
我找不到关于此的任何引用,即Entity Framework保持数据库打开直到forEach循环停止。我如何评估这是否是真正的性能?
小智 5
ToList()应用于的方法IQueryable<T>是可以在System.core.dll中使用.NET反编译器看到的扩展方法;如果源是ICollection<T>,则该方法将复制“私有数组” ,否则它将从源执行一个foreach循环。
一个IQueryable<T>is 的真正实现是System.Data.Entity.Infrastructure.DbQuery<TResult>,不是一个ICollection<T>。
因此,ToList()基本上使用复制源foreach。
现在,它取决于实现,但是以EF内核为例,有一个Enumerator类,当您处理该类时,可以看到Connection(IRelationalConnection)已关闭。根据另一个答案和ms 文档,您应该尽快关闭连接以释放连接并使它在连接池中可用。
为每个唯一的连接字符串创建一个连接池。创建池时,将创建多个连接对象并将其添加到池中,以便满足最小池大小要求。根据需要将连接添加到池中,直到指定的最大池大小(默认为100)。关闭或处置连接后,它们会释放回池中。
因此,如果您正在执行复杂的操作或在foreach中执行其他查询或其他任何操作,则首选ToList。