我有一个包含大量记录的数据库。我有无法过滤为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:我已经简化了该场景,在实际情况下,存在一些过滤器和排序,但是复制和粘贴该复杂代码没有意义。
分页是处理许多结果的一种好方法。
您的评论建议您了解Take
和Skip
。
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个晚宴(使其高效且可扩展)。