Как добавить значение в столбец в хранилище таблиц azure?

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