【问题标题】:Querying Windows Azure Table Storage with multiple query criteria使用多个查询条件查询 Windows Azure 表存储
【发布时间】:2014-01-16 16:42:42
【问题描述】:

我正在尝试查询 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 个查询条件。所以我目前正在这样做:

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 工作方式变化的影响。

【问题讨论】:

    标签: azure azure-table-storage data-partitioning


    【解决方案1】:

    然后可以将组合过滤器与另一个过滤器组合,根据需要重复多次。请参阅https://docs.microsoft.com/en-us/archive/blogs/windowsazurestorage/windows-azure-storage-client-library-2-0-tables-deep-dive#querying 中的示例“示例 - 查询 PartitionKey=”SamplePK” 和 RowKey 大于或等于“5”的所有实体。

    
    string pkFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "samplePK");
    
    string rkLowerFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, "5");
    
    string rkUpperFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, "10");
    
    // Note CombineFilters has the effect of "([Expression1]) Operator (Expression2]), as such passing in a complex expression will result in a logical grouping.
    string combinedRowKeyFilter = TableQuery.CombineFilters(rkLowerFilter, TableOperators.And, rkUpperFilter);
    
    string combinedFilter = TableQuery.CombineFilters(pkFilter, TableOperators.And, combinedRowKeyFilter);
    
    // OR 
    string combinedFilter = string.Format("({0}) {1} ({2}) {3} ({4})", pkFilter, TableOperators.And, rkLowerFilter, TableOperators.And, rkUpperFilter);
    TableQuery query = new TableQuery().Where(combinedFilter);
    

    【讨论】:

      【解决方案2】:

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

              .....
      
              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.....
      ....
      

      【讨论】:

        猜你喜欢
        • 2010-11-14
        • 1970-01-01
        • 2011-08-01
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        相关资源
        最近更新 更多