2017-01-13 2 views
0

Я пытаюсь установить атрибут в документе DynamoDB в пустой список с помощью запроса на обновление, используя библиотеку DynamoDBv2 из AWS SDK для .NET.Как установить атрибут DynamoDB в пустой список?

Я попытался выражение очевидного обновления, без успеха:

// Fails, expression attribute values cannot contain an empty list 
... 
ExpressionAttributeValues = new Dictionary<string, AttributeValue> { 
    { ":empty", new AttributeValue { L = new List<AttributeValue> { } } }, 
}, 
UpdateExpression = "SET #P.MyList = :empty", 
... 

Как я могу добиться этого?

ответ

2

Я нашел ответ после того, как выкалывал исходный код AWS SDK. Ключом является то, что свойство IsLSet можно установить. Это вызывает следующий код:

public static void SetIsSet<T>(bool isSet, ref List<T> field) 
{ 
    if (isSet) 
     field = new AlwaysSendList<T>(field); 
    else 
     field = new List<T>(); 
} 

При определении, если ваш AttributeValue инициализирован, это используется следующий код:

public static bool GetIsSet<T>(List<T> field) 
{ 
    if (field == null) 
     return false; 

    if (field.Count > 0) 
     return true; 

    var sl = field as AlwaysSendList<T>; 
    if (sl != null) 
     return true; 

    return false; 
} 

Это также показывает, почему использование new AttributeValue { L = new List<AttributeValue> { } } не имеет желаемого эффекта - этот метод вернет false, поскольку Count равно 0. Однако проверка специального типа AlwaysSendList вернет true, если вы установили свойство IsLSet.

Назад к коду, ответ должен использовать следующее:

... 
ExpressionAttributeValues = new Dictionary<string, AttributeValue> { 
    { ":empty", new AttributeValue { IsLSet = true } }, 
}, 
UpdateExpression = "SET #P.MyList = :empty", 
... 
Смежные вопросы