porta microsoft management azure azure-table-storage data-partitioning

microsoft - porta azure



Consulta de Windows Azure Table Storage con varios criterios de consulta (2)

TableQuery.CombineFilters consultar una tabla en el almacenamiento de Windows Azure e inicialmente estaba usando TableQuery.CombineFilters en TableQuery<RecordEntity>().Where funciona de la siguiente manera:

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

Lamentablemente, CombineFilters solo permite 2 criterios de consulta máx. Así que estoy haciendo esto:

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));

¿Hay alguna otra forma de hacerlo? Estoy convencido de que la forma en que lo estoy haciendo en este momento es vulnerable a los cambios en la forma en que funciona Azure Api.


Un filtro combinado puede combinarse con otro filtro, repitiendo tantas veces como sea necesario. Vea el ejemplo "Ejemplo - Consultar todas las entidades con PartitionKey =" SamplePK "y RowKey mayor o igual que" 5 "" en http://blogs.msdn.com/b/windowsazurestorage/archive/2012/11/06/ windows-azure-storage-client-library-2-0-tables-deep-dive.aspx .

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);


Esto es lo que estoy usando como una revisión rápida para el rango de registros cargados.

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