for 循环调用会导致从数据库中获取所有记录吗?有没有办法控制这种行为?
Does the for loop invocation result in fetching all records from the database and is there a way to control this behaviour?
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var query = context.Products
.Select(product => new
{
ProductId = product.ProductID,
ProductName = product.Name
});
Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
Console.WriteLine("Product Id: {0} Product name: {1} ",
productInfo.ProductId, productInfo.ProductName);
}
}
我知道当 for 循环开始执行时,查询会在数据库服务器上执行。假设数据库服务器 returns 将整个结果返回到 .net 应用程序并且整个数据保存在 query
变量中。
有什么方法可以限制这一点以防止内存溢出问题。
如 here 所述,直接在 EF IQueryable
streams 上使用 foreach
数据,将每个实体单独加载到内存中。
这减少了内存消耗,但需要注意的是,底层 table(s) 将在循环执行期间被锁定。
请注意,正如 David 在评论中强调的那样,您还应该禁用跟踪以使实体在每次迭代后都符合垃圾收集条件。
可以使用 AsNoTracking
:
为单个查询完成泰语
foreach (var productInfo in query.AsNoTracking())
或全局使用 QueryTrackingBehavior
.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var query = context.Products
.Select(product => new
{
ProductId = product.ProductID,
ProductName = product.Name
});
Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
Console.WriteLine("Product Id: {0} Product name: {1} ",
productInfo.ProductId, productInfo.ProductName);
}
}
我知道当 for 循环开始执行时,查询会在数据库服务器上执行。假设数据库服务器 returns 将整个结果返回到 .net 应用程序并且整个数据保存在 query
变量中。
有什么方法可以限制这一点以防止内存溢出问题。
如 here 所述,直接在 EF IQueryable
streams 上使用 foreach
数据,将每个实体单独加载到内存中。
这减少了内存消耗,但需要注意的是,底层 table(s) 将在循环执行期间被锁定。
请注意,正如 David 在评论中强调的那样,您还应该禁用跟踪以使实体在每次迭代后都符合垃圾收集条件。
可以使用 AsNoTracking
:
foreach (var productInfo in query.AsNoTracking())
或全局使用 QueryTrackingBehavior
.