#c# #azure #azure-table-storage
#c# #azure #azure-table-storage
Вопрос:
В настоящее время у меня есть существующий элемент внутри хранилища таблиц
partitionkey = test, rowkey = bob, number = 911
теперь предположим, что я хочу проверить, есть ли значение под именем столбца для этого пользователя, если есть, затем добавьте его с другим номером, разделенным символом ;
Я пробовал InsertOrMerge (), но он заменяет значение, я хочу, чтобы значение добавлялось в столбец, а не удалялось.
Редактировать: Вот код, который я пробовал
string tableName = "test2";
var batch = new TableBatchOperation();
CloudStorageAccount storageAccount =
CreateStorageAccountFromConnectionString(storageConnectionString);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient(new
TableClientConfiguration());
CloudTable table = tableClient.GetTableReference(tableName);
CustomerEntityTwo test = new CustomerEntityTwo("test", "bob")
{
number= "119"
};
batch.InsertOrMerge(test);
table.ExecuteBatch(batch);
Я знаю, что делаю это неправильно, я не знаю точно, как правильно добавить 119 к существующему числовому значению, но я бы хотел, чтобы оно было 911; 119 в столбце «число».
Комментарии:
1. Пожалуйста, покажите код, который вы пробовали.
2. извините, что я добавил это сейчас.
Ответ №1:
InsertOrMerge
операция работает не так, как вы думаете. Это создало бы объект, если он не существует, или объединило бы атрибуты с существующими атрибутами (добавив новые атрибуты, обновив существующие значения атрибутов и не затрагивая отсутствующие атрибуты), если объект существует.
В вашем сценарии вы хотите проверить, присутствует ли атрибут в сущности. Если атрибут присутствует, вы хотите взять существующее значение этого атрибута, добавить новое значение к этому элементу, а затем снова сохранить этот атрибут.
Для этого сначала вам нужно будет извлечь этот объект из хранилища, сравнить значение с новым значением, обновить значение и затем вызвать Merge
операцию над этим объектом.
Например, смотрите пример кода ниже:
var storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=acccount-key;EndpointSuffix=core.windows.net;");
var client = storageAccount.CreateCloudTableClient();
var table = client.GetTableReference("test");
var partitionKey = "test";
var rowKey = "bob";
var valueToCheck = "119";
var insertOrMergeEntity = true;
var op = TableOperation.Retrieve(partitionKey, rowKey);
var result = table.Execute(op);
var entity = result.Result as DynamicTableEntity;
if (entity == null)
{
entity = new DynamicTableEntity(partitionKey, rowKey);
}
if (entity.Properties.ContainsKey("number"))
{
var numberAttributeValue = entity.Properties["number"].StringValue;
if (numberAttributeValue.IndexOf(valueToCheck) < 0)
{
numberAttributeValue = "; " valueToCheck;
entity.Properties["number"] = new EntityProperty(numberAttributeValue);
}
else
{
insertOrMergeEntity = false;
}
}
else
{
entity.Properties.Add("number", new EntityProperty(valueToCheck));
}
if (insertOrMergeEntity)
{
var mergeOperation = TableOperation.InsertOrMerge(entity);
table.Execute(mergeOperation);
}