使用多个查询条件查询Windows Azure表存储

17

我正在尝试查询Windows Azure存储中的表格,最初是使用TableQuery.CombineFiltersTableQuery<RecordEntity>().Where函数中进行过滤:

我正在尝试查询 Windows Azure 存储中的表格,最初是在 TableQuery<RecordEntity>().Where 函数中使用 TableQuery.CombineFilters 进行筛选,如下所示:

TableQuery.CombineFilters(
    TableQuery.GenerateFilterCondition("PartitionKey",   QueryComparisons.GreaterThanOrEqual, lowDate),
    TableOperators.And,
    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.LessThanOrEqual, lowDate),
    TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, entityId)
));

遗憾的是,CombineFilters 最多只允许 2 个查询条件。因此,我目前正在这样做:

Unfortunately CombineFilters only allows 2 query criteria max. So I'm currently doing this:

var tableQuery = new TableQuery<RecordRowEntity>()
            .Where(TableQuery.CombineFilters("PartitionKey", string.Format("(PartitionKey ge '{0}') and (PartitionKey le '{1}') and (RowKey eq '{2}')", low, high, entityId));

还有其他的方法吗?我担心目前的做法容易受到 Azure Api 工作方式变化的影响。

2个回答

30
一个组合过滤器可以与另一个过滤器相结合,重复多少次都可以。示例:“样例 - 查询所有PartitionKey =”SamplePK“且RowKey大于或等于“5”的实体”的示例,请参见https://learn.microsoft.com/en-us/archive/blogs/windowsazurestorage/windows-azure-storage-client-library-2-0-tables-deep-dive#querying

string pkFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "samplePK");
string rkLowerFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, "5");
string rkUpperFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, "10");
// 注意,CombineFilters的效果是“([Expression1])Operator(Expression2]),因此传递复杂表达式将导致逻辑分组。 string combinedRowKeyFilter = TableQuery.CombineFilters(rkLowerFilter,TableOperators.And,rkUpperFilter);
string combinedFilter = TableQuery.CombineFilters(pkFilter,TableOperators.And,combinedRowKeyFilter);
// 或者 string combinedFilter = string.Format("({0}) {1} ({2}) {3} ({4})", pkFilter, TableOperators.And, rkLowerFilter, TableOperators.And, rkUpperFilter); TableQuery query = new TableQuery().Where(combinedFilter);

1

这是我用来快速检查上传记录范围的内容。

        .....

        Dictionary<int, string[]> retrievedRecords = new Dictionary<int, string[]>();
        int i = 0;

        StorageCredentials creds = new StorageCredentials(accountName, accountKey); // table storage name, Azure provided KEY1 string
        CloudStorageAccount storageAccount = new CloudStorageAccount(creds, useHttps: true);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        CloudTable table = tableClient.GetTableReference(tableName); // your table name

        // filters
        string filter1 = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionName); // partitionName i.e.: "myTablePartition1"
        string filter2 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, recordStart); // recordStart i.e.: "123"
        string filter3 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, recordEnd); // recordEnd i.e.: "567"

        string filterRange = TableQuery.CombineFilters(filter2, TableOperators.And, filter3);


        // query.
        TableQuery<CustomerEntity> rangeQuery = new TableQuery<CustomerEntity>().Where(

            TableQuery.CombineFilters(filter1, TableOperators.And, filterRange)
        );

        // Loop & store
        foreach (CustomerEntity entityT in table.ExecuteQuery(rangeQuery))
        {
            string PartitionKey = entityT.PartitionKey;
            string RowKey = entityT.RowKey;
            string col1 = entityT.col1;
            string col2  = entityT.col2;
            string col3  = entityT.col3;
            string col4  = entityT.col4;
            string col5  = entityT.col5;
            string col6  = entityT.col6;

            string[] row = new string[] { PartitionKey, RowKey, col1 , col2, col3, col4, col5, col6 };
            retrievedRecords.Add(i, row);

            i++;
        }

        return retrievedRecords;

// function end or else.....
....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接