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

问题描述 投票:0回答:1

我有一个包含大量记录的数据库。我有无法过滤为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()查询会很疯狂。

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

c# sql-server linq linq-to-sql database-cursor
1个回答
0
投票

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

您的评论建议您了解TakeSkip

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

public IQueryable<Dinner> FindUpcomingDinners() 

(...)

var upcomingDinners = dinnerRepository.FindUpcomingDinners();

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

(...)

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


© www.soinside.com 2019 - 2024. All rights reserved.