【问题标题】:How to tell DocumentDB SDK to use camelCase during linq query?如何在 linq 查询期间告诉 DocumentDB SDK 使用 camelCase?
【发布时间】:2016-05-27 18:02:19
【问题描述】:

考虑存储在User集合中的文档{ "userName": "user1" },以及下面的User类:

public class User
{
        public string Id { get; set; }
        public string UserName { get; set; }
}

使用以下 JSON.net 设置:

JsonConvert.DefaultSettings = () =>
{
    return new JsonSerializerSettings
    {
       ContractResolver = new CamelCasePropertyNamesContractResolver(),
    };
};

当我像这样使用 Linq 查询时:

var t = _client.CreateDocumentQuery<User>(_collection.SelfLink)
            .Where(u => u.UserName == "user1").AsDocumentQuery().ExecuteNextAsync();

t.Wait();

var users = t.Result;
var user = users.FirstOrDefault();

user 为空。将文档更改为具有帕斯卡外壳或将 POCO 更改为使用骆驼外壳可以解决此问题。当然,我不想要其中的任何一个,因为我希望我的 JSON 对象和 C# 对象被“标准化”。

如何告诉 DocumentDB SDK 使用驼峰式大小写映射我的对象的属性名称,类似于 JSON.net?

【问题讨论】:

  • this answer 能解决您的问题吗?这不完全是一个重复的问题,但我相信已发布的答案涵盖了您正在寻找的内容。

标签: azure-cosmosdb


【解决方案1】:

DocumentDB LINQ 提供程序不选择 JsonConvert.DefaultSettings。通常,您可以使用 DefaultSettings 来控制 camelCase,但对于您希望在 LINQ Where 子句中使用的那些属性,必须使用 DTO 上的 JsonProperty 属性显式设置名称。

public class User
{
    public string Id { get; set; }

    [JsonProperty("userName")]
    public string UserName { get; set; }
}

虽然有点乏味并且是一个很好的错误来源,但它似乎是你目前唯一的选择。

【讨论】:

【解决方案2】:

在与 Cosmos DB 类似的情况下,我能够在类声明级别将我的对象的所有属性设置为 Camel 大小写,如下所示:

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class User
{
    public string Id { get; set; }

    public string UserName { get; set; }
}

这就是告诉 NewtonSoft.Json 使用 Camel 大小写进行序列化的方式。

【讨论】:

  • 这不适用于 CosmosDB DocumentClient。仅使用 JsonProperty("lowerCaseName") 控制每个属性的大小写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多