我有一个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个客户.
对于LINQ to Objects:
yourCollection
.Select((v, i) => new {Value = v, Index = i})
.GroupBy(x => x.Index / 100)
Run Code Online (Sandbox Code Playgroud)
不确定这是否适用于Azure虽然...
在“普通” 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提供程序进行分区,那么我不确定您会怎么做。
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |