如何创建创建最多100个对象组的Linq表达式

Tho*_*sen 3 c# linq

我有一个LINQ表达式,可以按分区对Azure表存储中的客户进行分组.

由于Azure仅支持一次最多100个实体的批处理操作(并且批处理中的实体具有相同的PartitionKey),因此我需要每个组包含最多100个实体.

//How to complete this LINQ expression
var groups = customers.GroupBy(c => c.PartitionKey)....;

//Do some Azure table storage magic in parallel
Parallel.ForEach(groups , customersInGroup => {...});
Run Code Online (Sandbox Code Playgroud)

如何完成LINQ表达式,因此每组最多包含100个客户?那就是...如果客户收集,例如.有142个客户使用相同的PartitionKey,我想创建两个组...一组有100个客户,一个有42个客户.

Mar*_*ers 9

对于LINQ to Objects:

yourCollection
   .Select((v, i) => new {Value = v, Index = i}) 
   .GroupBy(x => x.Index / 100)
Run Code Online (Sandbox Code Playgroud)

不确定这是否适用于Azure虽然...


Jon*_*eet 5

在“普通” LINQ中没有什么可以直接执行此操作的,但是MoreLINQ有一种Batch可能会有用的方法:

public static IEnumerable<TResult> Batch<TSource, TResult>
    (this IEnumerable<TSource> source, int size,
     Func<IEnumerable<TSource>, TResult> resultSelector)

public static IEnumerable<IEnumerable<TSource>> Batch<TSource>
    (this IEnumerable<TSource> source, int size)
Run Code Online (Sandbox Code Playgroud)

请注意,在您的情况下,您可能想要以下内容:

var groups = customers.GroupBy(c => c.PartitionKey).Batch(100, p => p.ToList());
Run Code Online (Sandbox Code Playgroud)

以便立即实现返回的结果。

当然,这是假设您使用的是LINQ to Objects-如果您尝试通过另一个LINQ提供程序进行分区,那么我不确定您会怎么做。