首页 > 解决方案 > 如何在天蓝色表存储的列中附加值?

问题描述


我目前在 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 在“数字”列下。

标签: c#azureazure-table-storage

解决方案


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

推荐阅读