检查linq语句中某个索引是否为null的最快方法

时间:2012-09-07 15:36:53

标签: c# performance linq

基本详情

我有一个linq语句,它从数据库中获取一些记录并将它们放在System.Linq.Enumerable中:

var someRecords = someRepoAttachedToDatabase.Where(p=>true);

假设这抓取了吨(25k +)的记录,我需要对所有记录执行更新操作。为了加快速度,我必须决定使用分页并同时执行100块而不是所有记录所需的操作。

问题中的代码用于两个地方:一种更新数据库中大量值的服务方法,以及一种获取旧值和更新值的集成测试,以确保更新正确执行。

问题

有问题的行是我计算子集中记录数量的行,看看我们是否在最后一页;如果子集中的记录数小于分页的大小 - 那么这意味着没有剩余的记录。我想知道的是最快的方法是什么?

问题中的代码

int pageSize = 100;
bool moreData = true;
int currentPage = 1;
while (moreData)
{
   var subsetOfRecords = someRecords.Skip((currentPage - 1) * pageSize).Take(pageSize); //this is also a System.Linq.Enumerable
   if (subsetOfRecords.Count() < pageSize){ moreData = false;} //line in question
   //do stuff to records in subset
   currentPage++;
}

我考虑过的事情

  1. subsetOfRecords.Count()&lt;的pageSize
  2. subsetOfRecords.ElementAt(pageSize - 1)== null(导致越界异常 - 可以捕获异常并将moreData设置为false)
  3. 将subsetOfRecords转换为数组(由于声明了subsetOfRecords的方式,将someRecords转换为数组将无法工作 - 但我愿意更改它)
  4. 我确信我错过了很多其他想法。

1 个答案:

答案 0 :(得分:2)

使用parallels库。它会自动处理你的paralellezation和分页。处理记录的顺序是否重要?

var someRecords = someRepoAttachedToDatabase.Where(p=>true); 
Parallel.Foreach(someRecords, record=>DoSomethingWithRecord(record));