在C#程序停止枚举后,从IQueryable生成的SQL查询是否继续执行?

我有一个包含大量记录的数据库。我有无法过滤为SQL的记录过滤条件。请考虑以下情形:

IItemRepository repo = new ItemRepository();
IQueryable<Item> items = repo.Getall();
IEnumerator<Item> itemEnumerator = items.GetEnumerator();
List<BinaryData> binaryDataList = new List<BinaryData>();

while (binaryDataList.Count < 20 && itemEnumerator.MoveNext())
{
    BinaryData binaryData = BinaryData.Extract(itemEnumerator.Current.BinaryData);

    if (IsValidBinaryData(binaryData))
    {
        binaryDataList.Add(binaryData);
    }
}

一旦程序退出while循环,查询将继续在服务器上执行还是停止?我需要停止它,因为在此数据库上执行Getall()查询会很疯狂。

编辑:我已经简化了该方案,在实际情况下,存在一些过滤器和排序,但是复制和粘贴该复杂代码没有意义。

kyony 回答:在C#程序停止枚举后,从IQueryable生成的SQL查询是否继续执行?

分页是处理许多结果的一种好方法。

您的评论建议您了解TakeSkip

Implement Efficient Data Paging有一个完整的例子。这只是其中的一小部分。

public IQueryable<Dinner> FindUpcomingDinners() 

(...)

var upcomingDinners = dinnerRepository.FindUpcomingDinners();

var paginatedDinners = upcomingDinners.Skip((page ?? 0) * pageSize)
                                         .Take(pageSize)
                                         .ToList();

     

(...)

     

Entity Framework足够聪明,可以构造一个优化的SQL查询,该查询在SQL数据库中而不是Web服务器中执行此跳过逻辑。这意味着即使数据库中有数以百万计的即将举行的晚宴,该请求中也只会检索到我们想要的10个晚宴(使其高效且可扩展)。


问题

  

一旦程序退出while循环,查询将继续在服务器上执行还是停止?我需要停止它,因为在此数据库上执行GetAll()查询会很疯狂。

没有“继续”来执行查询。枚举IQueryable时,该代码不会一张一张地获取记录。在枚举时,查询将发送到数据库,所有结果均被提取,然后存储在内存中。

本文链接:https://www.f2er.com/3153642.html

大家都在问