IQueryable <T>扩展方法,批量获取数据

jlp*_*jlp 6 .net c# linq-to-sql

有没有人发现/编码扩展方法批量查询数据(使用linq到sql)?我已经看过IEnumerable扩展,但我正在寻找我可能会使用的东西:

IQueryable<Order> orders = from i in db.Orders select i;
foreach(var batch in orders.InBatches(100))
{
   //batch of 100 products
   foreach(var order in batch)
   {
      //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 10

你能做的是:

public static IEnumerable<IQueryable<T>> InBatches(
    this IQueryable<T> collection, int size)
{  
    int totalSize = collection.Count();

    for (int start = 0; start < totalSize; start += size)
    {
        yield return collection.Skip(start).Take(size);
    }
}
Run Code Online (Sandbox Code Playgroud)

此扩展方法允许您对返回IQueryables执行额外的过滤器.但是,实用性非常有限.我想不出任何好的情况:-).在大多数情况下,你只想流式传输结果并返回一个IEnumerable<IEnumerable<T>>就好了,甚至更好,因为这将导致单个SQL查询,而显示的方法将导致N + 1个查询.

  • 当您想要对表的所有记录进行操作时(例如,您添加了一个新列,并且在生产中您希望使用适当的值填充),它非常有用.然后你不想进行单个查询来获取所有数据,因为它可能因为数量太大而超时.因此,您批量进行查询,并在更多步骤中进行更新,但没有超时:) (2认同)