C# 查询Azure表存储-使用静态值数组进行比较
我需要修改现有Azure表存储查询,假设我是一个整数查询检索最新报告:C# 查询Azure表存储-使用静态值数组进行比较,c#,.net,linq,azure,azure-table-storage,C#,.net,Linq,Azure,Azure Table Storage,我需要修改现有Azure表存储查询,假设我是一个整数查询检索最新报告: string rowCompare = String.Format(CommonDefs.inverseTimeStampRowKeyFormat, DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks); var result = (from er in this.serviceContext.EntityReportsTable
string rowCompare = String.Format(CommonDefs.inverseTimeStampRowKeyFormat, DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
var result = (from er in this.serviceContext.EntityReportsTable
where er.PartitionKey.Equals(i.ToString(), StringComparison.OrdinalIgnoreCase) && er.RowKey.CompareTo(rowCompare) > 0
select er).Take(1)).FirstOrDefault();
我需要修改它来检索几个已知实体的最新报告,将单个整数I替换为整数数组,比如int[]{1,6,10}
除了对数组中的每个参数按顺序运行现有查询外,是否有一种方法可以在一个查询中执行?Sql中的Like IN子句?Azure表存储不支持Sql中的
IN子句。但是,您可以并行启动查询并比较结果,而不是按顺序执行查询。例如,请看下面的伪代码:
List<Task<T>> tasks = new List<Task<T>>();
foreach (var i in integerArray)
{
tasks.Add(Task.Factory.StartNew<T>(() => {
string rowCompare = String.Format(CommonDefs.inverseTimeStampRowKeyFormat, DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
var result = (from er in this.serviceContext.EntityReportsTable
where er.PartitionKey.Equals(i.ToString(), StringComparison.OrdinalIgnoreCase) && er.RowKey.CompareTo(rowCompare) > 0
select er).Take(1)).FirstOrDefault();
}));
}
Task.WaitAll(tasks.ToArray());
foreach (var task in tasks)
{
var queryResult = task.Result;
//Work on the query result
}
List tasks=newlist();
foreach(整数数组中的var i)
{
tasks.Add(Task.Factory.StartNew(()=>{
string rowCompare=string.Format(CommonDefs.inverseTimeStampRowKeyFormat,DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks);
var result=(来自this.serviceContext.EntityReportsTable中的er)
其中er.PartitionKey.Equals(i.ToString(),StringComparison.OrdinalIgnoreCase)和&r.RowKey.CompareTo(rowCompare)>0
选择er.Take(1)).FirstOrDefault();
}));
}
Task.WaitAll(tasks.ToArray());
foreach(任务中的var任务)
{
var queryResult=task.Result;
//处理查询结果
}
您可以使用最新版本的Azure存储客户端库这是您任务的完整伪代码:
var rowCompare = String.Format("{0}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
var items = new []{"1", "6", "10"};
var filters =
items.Select(key => TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, key)).ToArray();
var combine =
filters.Length > 0
? filters[0]
: null;
for (var k = 0; k < filters.Length; k++)
combine = TableQuery.CombineFilters(combine, TableOperators.Or, filters[k]);
var final = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThan, rowCompare);
if (!string.IsNullOrEmpty(combine))
final = TableQuery.CombineFilters(final, TableOperators.And, combine);
var query = new TableQuery<EntityReport>().Where(final);
var client = CloudStorageAccount.DevelopmentStorageAccount.CreateCloudTableClient();
var table = client.GetTableReference("EntityReports");
var result = table.ExecuteQuery(query);
var rowCompare=String.Format(“{0}”,DateTime.MaxValue.Ticks-DateTime.UtcNow.Ticks);
变量项=新[]{“1”、“6”、“10”};
变量滤波器=
items.Select(key=>TableQuery.GenerateFilterCondition(“PartitionKey”,QueryComparisons.Equal,key)).ToArray();
变量组合=
过滤器。长度>0
? 过滤器[0]
:null;
for(var k=0;k
Azure表没有提供与IN子句等效的服务器端查询功能。因此,很遗憾,如果您的范围不是连续的,那么简短的回答是否定的。我有一个建议,可以烘焙生成的文本顺序或查询。如果数组太大,则可能需要分区来复制。似乎是一个合理的选择,但管道将最有可能是复杂的。我完全同意你。当过滤器的长度超过150,我得到了坏的要求。有什么想法或替代方案吗?将查询分割成更小的块,并使用迭代器将结果合并回内存中。