我目前有一个看起来如下的行为:
TableQuery<CloudTableEntity> query = new TableQuery<CloudTableEntity().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, PK));
foreach (CloudTableEntity entity in table.ExecuteQuery(query))
{
//Logic
}
我一直在研究相似之处,但是,我找不到任何关于如何使用它的好代码示例。我希望能够查询数千个分区键,如
CloudTableEntity().Where(PartitionKey == "11" || PartitionKey == "22")
我可以拥有大约40000个分区键。有没有办法做到这一点?
答案 0 :(得分:2)
以下示例代码将并行发出多个分区键查询:
CloudTable table = tableClient.GetTableReference("xyztable");
List<string> pkList = new List<string>(); // Partition keys to query
pkList.Add("1");
pkList.Add("2");
pkList.Add("3");
Parallel.ForEach(
pkList,
//new ParallelOptions { MaxDegreeOfParallelism = 128 }, // optional: limit threads
pk => { ProcessQuery(table, pk); }
);
ProcessQuery定义为:
static void ProcessQuery(CloudTable table, string pk)
{
string pkFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, pk);
TableQuery<TableEntity> query = new TableQuery<TableEntity>().Where(pkFilter);
var list = table.ExecuteQuery(query).ToList();
foreach (TableEntity entity in list)
{
// Process Entities
}
}
请注意,在上面列出的同一查询中对两个分区键进行OR运算将导致全表扫描。要避免全表扫描,请按照上面的示例代码,按每个查询执行一个分区键的单个查询。
有关查询构造的详细信息,请参阅http://blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/how-to-get-most-out-of-windows-azure-tables.aspx
答案 1 :(得分:0)
使用table.ExecuteQuerySegmentedAsync将提供更好的性能