如何使用分区 n 行键从 azure table w/o 检索单个实体
How to retrieve single entity from azure table w/o using partition n row key
我想创建一个通用函数来从 azure table storage.Now 中检索实体 storage.Now 我在 table 中有多个实体,每个实体都有不同的属性。所以我想通过实体的 属性 从分区过滤中检索单个实体。
我生成了随机行键(从 1-100)。因此,使用分区 n 行键进行检索对我来说不是一个选项。
想要使用实体的分区键和 1 或 2 属性进行检索?
怎么做?
我写这个是为了从分区中检索所有值:
public object GetEntity(string partitionKey, string rowKey)
{
CloudTable table = tableClient.GetTableReference(Constants.STORAGETABLENAME);
TableOperation tableOperation = null;
switch (partitionKey)
{
case Constants.PARTITION_RESPONSEFILTERVALUE:
tableOperation = TableOperation.Retrieve<ResponseFilterParamsEntity>(partitionKey, rowKey);
break;
case Constants.PARTITION_RESPONSEFILTER:
tableOperation = TableOperation.Retrieve<ResponseFilterFieldsEntity>(partitionKey, rowKey);
break;
case Constants.PARTITION_REDISCACHE:
tableOperation = TableOperation.Retrieve<RedisCacheEntity>(partitionKey, rowKey);
break;
default:break;
}
return table.Execute(tableOperation).Result;
}
此函数使用分区键进行过滤,并且仅使用 1 属性 :
public List<T> GetCustEntities<T>(string partitionKey, string strFilter, string strFilterValue, T entity) where T : TableEntity, new()
{
try
{
var table = tableClient.GetTableReference(Constants.STORAGETABLENAME);
var Q1 = new TableQuery<T>().Where(TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
TableOperators.And,
TableQuery.GenerateFilterCondition(strFilter, QueryComparisons.Equal, strFilterValue)));
var results = table.ExecuteQuery(Q1).Select(ent => (T)ent).ToList();
return results;
}
catch (StorageException ex)
{
return null;
}
}
您可以将上面文档示例中的 RowKey 替换为任何其他属性,例如:
// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the CloudTable object that represents the "people" table.
CloudTable table = tableClient.GetTableReference("people");
// Create the table query.
TableQuery<CustomerEntity> rangeQuery = new TableQuery<CustomerEntity>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "Smith"),
TableOperators.And,
TableQuery.GenerateFilterCondition("PhoneNumber", QueryComparisons.LessThan, "1345678")));
// Loop through the results, displaying information about the entity.
foreach (CustomerEntity entity in table.ExecuteQuery(rangeQuery))
{
Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey,
entity.Email, entity.PhoneNumber);
}
您的示例代码:
public List<T> GetCustEntities<T>(string partitionKey, Dictionary<string, string> propertyFilters) where T : TableEntity, new()
{
var table = tableClient.GetTableReference(Constants.STORAGETABLENAME);
var pkFilter = TableQuery.GenerateFilterCondition(TableConstants.PartitionKey, QueryComparisons.Equal, partitionKey;
var combinedFilter = pkFilter;
foreach (var kvp in propertyFilters)
{
var newFilter = TableQuery.GenerateFilterCondition(kvp.Key, QueryComparisons.Equal, kvp.Value);
combinedFilter = TableQuery.CombineFilters(combinedFilter, TableOperators.And, newFilter);
}
var query = new TableQuery<T>().Where(combinedFilter);
var results = table.ExecuteQuery(query).ToList();
return results;
}
我想创建一个通用函数来从 azure table storage.Now 中检索实体 storage.Now 我在 table 中有多个实体,每个实体都有不同的属性。所以我想通过实体的 属性 从分区过滤中检索单个实体。 我生成了随机行键(从 1-100)。因此,使用分区 n 行键进行检索对我来说不是一个选项。 想要使用实体的分区键和 1 或 2 属性进行检索? 怎么做?
我写这个是为了从分区中检索所有值:
public object GetEntity(string partitionKey, string rowKey)
{
CloudTable table = tableClient.GetTableReference(Constants.STORAGETABLENAME);
TableOperation tableOperation = null;
switch (partitionKey)
{
case Constants.PARTITION_RESPONSEFILTERVALUE:
tableOperation = TableOperation.Retrieve<ResponseFilterParamsEntity>(partitionKey, rowKey);
break;
case Constants.PARTITION_RESPONSEFILTER:
tableOperation = TableOperation.Retrieve<ResponseFilterFieldsEntity>(partitionKey, rowKey);
break;
case Constants.PARTITION_REDISCACHE:
tableOperation = TableOperation.Retrieve<RedisCacheEntity>(partitionKey, rowKey);
break;
default:break;
}
return table.Execute(tableOperation).Result;
}
此函数使用分区键进行过滤,并且仅使用 1 属性 :
public List<T> GetCustEntities<T>(string partitionKey, string strFilter, string strFilterValue, T entity) where T : TableEntity, new()
{
try
{
var table = tableClient.GetTableReference(Constants.STORAGETABLENAME);
var Q1 = new TableQuery<T>().Where(TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
TableOperators.And,
TableQuery.GenerateFilterCondition(strFilter, QueryComparisons.Equal, strFilterValue)));
var results = table.ExecuteQuery(Q1).Select(ent => (T)ent).ToList();
return results;
}
catch (StorageException ex)
{
return null;
}
}
您可以将上面文档示例中的 RowKey 替换为任何其他属性,例如:
// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
// Create the CloudTable object that represents the "people" table.
CloudTable table = tableClient.GetTableReference("people");
// Create the table query.
TableQuery<CustomerEntity> rangeQuery = new TableQuery<CustomerEntity>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "Smith"),
TableOperators.And,
TableQuery.GenerateFilterCondition("PhoneNumber", QueryComparisons.LessThan, "1345678")));
// Loop through the results, displaying information about the entity.
foreach (CustomerEntity entity in table.ExecuteQuery(rangeQuery))
{
Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey,
entity.Email, entity.PhoneNumber);
}
您的示例代码:
public List<T> GetCustEntities<T>(string partitionKey, Dictionary<string, string> propertyFilters) where T : TableEntity, new()
{
var table = tableClient.GetTableReference(Constants.STORAGETABLENAME);
var pkFilter = TableQuery.GenerateFilterCondition(TableConstants.PartitionKey, QueryComparisons.Equal, partitionKey;
var combinedFilter = pkFilter;
foreach (var kvp in propertyFilters)
{
var newFilter = TableQuery.GenerateFilterCondition(kvp.Key, QueryComparisons.Equal, kvp.Value);
combinedFilter = TableQuery.CombineFilters(combinedFilter, TableOperators.And, newFilter);
}
var query = new TableQuery<T>().Where(combinedFilter);
var results = table.ExecuteQuery(query).ToList();
return results;
}