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

本文关键字:数据 扩展 方法 获取 IQueryable | 更新日期: 2023-09-27 18:13:51

是否有人发现/编码的扩展方法查询数据(使用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
   }
}

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

你可以这样做:

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);
    }
}

这个扩展方法允许你在返回的IQueryables上做额外的过滤器。然而,它的用处是非常有限的。我想不出任何好的场景:-)。在大多数情况下,您只想流式处理结果,返回IEnumerable<IEnumerable<T>>就可以了,甚至更好,因为这将导致单个SQL查询,而所示的方法将导致N + 1查询。

TakeSkip怎么了?这些是LINQ操作符,用于从IEnumerable<T>IQueryable<T>(及其非泛型对应项)中获取批。

如果你不关心批处理本身,你只是想打破连接的大小或事务的目的,你可以这样做:

public static IEnumerable<T> InBatches<T>(this IQueryable<T> collection, int batchSize)
{
    int start = 0;
    int records = 0;
    IQueryable<T> batch;
    // For the first batch
    start -= batchSize;
    do {
        records = 0;
        start += batchSize;
        batch = collection.Skip(start).Take(batchSize);
        foreach (T item in batch) {
            records += 1;
            yield return item;
        }
    } while (records == batchSize);
}