如何创建创建最多100个对象组的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 => {...});
如何完成LINQ表达式,因此每组最多包含100个客户? 那就是……如果客户收集,例如。 有142个客户使用相同的PartitionKey,我想创建两个组…一个组有100个客户,一个有42个客户。
“普通”LINQ中没有任何内容可以直接执行此操作,但是MoreLINQ有一个Batch
方法,您可能会发现它很有用:
public static IEnumerable Batch (this IEnumerable source, int size, Func, TResult> resultSelector) public static IEnumerable> Batch (this IEnumerable source, int size)
请注意,在您的情况下,您可能需要以下内容:
var groups = customers.GroupBy(c => c.PartitionKey).Batch(100, p => p.ToList());
以便返回的结果立即生效。
当然,这假设你正在使用LINQ to Objects – 如果你试图通过另一个LINQ提供程序进行分区,我不确定你是怎么做的。
对于LINQ to Objects:
yourCollection .Select((v, i) => new {Value = v, Index = i}) .GroupBy(x => x.Index / 100)
不确定这是否适用于Azure虽然…
这听起来像.Skip
和.Skip
的工作,如下所示:
result = collection.Skip(100 * i).Take(100);
i
是您要获取的页面或组号。
这是我的测试应用“into”和“take”到组结果:
static void Main(string [] args) { int [] numbers = new int [] { 1,2,3,4,5,6,7,8,9,0 }; var result = from n in number group n by n%2 到group_numbers 选择新{short_group = group_numbers.Take(3)}; foreach(结果中的var v) { foreach(v.short_group中的var v1) { Console.WriteLine(v1.ToString()); } Console.WriteLine(); } }
输出:
1 3 五 2 4 6