C# 查询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

我需要修改现有Azure表存储查询,假设我是一个整数查询检索最新报告:

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,我得到了坏的要求。有什么想法或替代方案吗?将查询分割成更小的块,并使用迭代器将结果合并回内存中。