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.