C# LINQ语句以100个块的形式创建DynamicTableEntities的嵌套列表

C# LINQ语句以100个块的形式创建DynamicTableEntities的嵌套列表,c#,.net,linq,azure-table-storage,C#,.net,Linq,Azure Table Storage,我正在尝试创建一批100条可从Azure表存储中删除的记录。我在这里找到了一篇关于高效创建批以删除表记录的优秀文章: 并一直遵循这一点。我面临的问题与本文中的示例不同,我的删除将具有不同的分区键。因此,与简单地将结果分成100个批次(如示例中所示)不同,我首先需要将它们分成类似分区键的组,然后检查这些列表,如果计数大于100,则进一步细分它们(因为Azure建议一次只分100个记录批次,并且它们都需要相同的分区键) 让我说,我对可枚举LINQ和本文中描述的非查询风格很糟糕,所以我有点迷茫。我已经

我正在尝试创建一批100条可从Azure表存储中删除的记录。我在这里找到了一篇关于高效创建批以删除表记录的优秀文章:

并一直遵循这一点。我面临的问题与本文中的示例不同,我的删除将具有不同的分区键。因此,与简单地将结果分成100个批次(如示例中所示)不同,我首先需要将它们分成类似分区键的组,然后检查这些列表,如果计数大于100,则进一步细分它们(因为Azure建议一次只分100个记录批次,并且它们都需要相同的分区键)

让我说,我对可枚举LINQ和本文中描述的非查询风格很糟糕,所以我有点迷茫。我已经编写了一个小的解决方案,它确实通过分区ID创建这些批处理,并且代码可以删除它们,我只是不处理基于分区键可能要删除100多行的可能性。下面的代码只是一个示例,向您展示了我是如何通过分区键分割更新的

List<string> partitionKeys = toDeleteEntities.Select(x => x.PartitionKey).Distinct().ToList();

List<List<DynamicTableEntity>> chunks = new List<List<DynamicTableEntity>>();

for (int i = 0; i < partitionKeys.Count; ++i)
 {
  var count = toDeleteEntities.Where(x => x.PartitionKey == partitionKeys[i]).Count();
          //still need to figure how to split by groups of 100.
         chunks.Add(toDeleteEntities.Distinct().Where(x=>x.PartitionKey == partitionKeys[i]).ToList());
 }
我希望这是有意义的,如果没有,请随时要求澄清

提前谢谢

编辑以澄清:

这个想法很简单,我想按分区键分组,只取100行,然后再创建同一分区键的另一行并添加其余的行


谢谢,

您可以使用的一种有用的LINQ方法是。它基本上根据选择器将集合划分为组。因此,在您的情况下,您可能希望按PartitionKey分组:

var partitionGroups=todeletenties.GroupBy(d=>d.PartitionKey);
当您遍历此集合时,将得到一个。最后,要获得正确的批次,可以使用和

foreach(partitionGroups中的var partitionGroup)
{
var partitionKey=partitionGroup.Key;
int startPosition=0;
int count=partitionGroup.count();
而(计数>0)
{
int batchSize=计数%maxBatchSize>0?计数%maxBatchSize:maxBatchSize;
var partitionBatch=partitionGroup.Skip(startPosition).Take(batchSize);
//在这里处理您的批次
添加(新列表(partitionBatch));
起始位置+=批量大小;
计数=计数-批量大小;
}
}

你希望得到什么,你能提供一个例子吗。你到底想完成什么
// Split into chunks of 100 for batching
        List<List<TableEntity>> rowsChunked = tableQueryResult.Result.Select((x, index) => new { Index = index, Value = x })
            .Where(x => x.Value != null)
            .GroupBy(x => x.Index / 100)
            .Select(x => x.Select(v => v.Value).ToList())
            .ToList();
[0]
  [0][Entity]
  [1][Entity]
   ...
  [99][Entity]
[1]
  [0][Entity]
  [1][Entity]
   ...