更改保存到Cosmos Db中的属性名称,而不使用JsonProperty属性

时间:2018-01-24 09:48:03

标签: c# json linq azure-cosmosdb

我需要更改保存到Cosmos Db中的属性的名称。我不想使用Newtonsoft.Json中的JsonProperty属性,因为使用它可以始终更改属性的名称,当我调用action方法时也会在JSON响应中使用。所以我只会保存到Cosmos Db中的JSON具有不同的属性名称。为此,我创建了一个名为CosmosDbPropertyAttribute的自定义属性,如下所示:

[AttributeUsage(AttributeTargets.Property)]
public class CosmosDbPropertyAttribute : Attribute
{
    public string PropertyName { get; set; }

    public CosmosDbPropertyAttribute(string propertyName)
    {
        PropertyName = propertyName;
    }
}

以下是使用CosmosDbProperty属性的示例类:

public abstract class CosmosDbDocumentBase : ICosmosDbDocument
{
    [CosmosDbProperty("CID")]
    public virtual string CustomerId { get; set; }

    [CosmosDbProperty("DT")]
    public virtual int DocumentType { get; set; }

    [CosmosDbProperty("id")]
    public string Id { get; set; }

    [CosmosDbProperty("PK")]
    public string PartitionKey { get; set; }
}

在序列化过程中,一切正常,因为我已经在DocumentClient对象的JsonSerializerSettings中的自定义ContractResolver中重写了CreateProperty方法。

public class CosmosDbDefaultContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty jsonProperty = base.CreateProperty(member, memberSerialization);
        if (member.GetCustomAttributes(typeof(CosmosDbPropertyAttribute)).FirstOrDefault() is CosmosDbPropertyAttribute PropertyAttribute)
        {
            jsonProperty.PropertyName = PropertyAttribute.PropertyName;
            return jsonProperty;
        }
        else
        {
            return jsonProperty;
        }
    }
}

现在问题是查询数据库。当我像这样进行LINQ查询时

var _DbClient = new DocumentClient(new Uri("_DB URI_"), "_DB KEY_", new JsonSerializerSettings()
{
    ContractResolver = new CosmosDbDefaultContractResolver()
}, connectionPolicy);

var Query = _DbClient.CreateDocumentQuery<T>().Where(a => a.DocumentType == 0).AsEnumerable();

查询语句错误,因为引用原始属性名称DocumentType而不是CosmosDbProperty属性中指定的DT,因此查询失败。

0 个答案:

没有答案