20

Considering the document { "userName": "user1" } stored in the User collection, and the following User class:

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

With the following JSON.net settings:

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

When I query with Linq as such:

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 is null. Changing the Document to have a pascal casing or the POCO to use a camel casing solves the issue. Of course I do not want any of those as I want my JSON objects and C# objects to be "standarized".

How can I tell the DocumentDB SDK to map my object's property names using camel casing, similar as JSON.net?

Jonas Stawski
  • 6,682
  • 6
  • 61
  • 106
  • Does [this answer](http://stackoverflow.com/a/25879197/272109) solve your issue? It's not exactly a duplicate question, but I believe the published answer covers what you're looking for. – David Makogon May 27 '16 at 18:16

3 Answers3

28

The DocumentDB LINQ provider does not pick up the JsonConvert.DefaultSettings. In general you can use the DefaultSettings to control camelCase, but for those properties you wish to use in a LINQ Where clause must have the name explicitly set using JsonProperty attribute on your DTO.

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

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

Although a bit tedious and a good source for bugs, it seems to be your only option for now.

Eric Pohl
  • 2,324
  • 1
  • 21
  • 31
hsulriksen
  • 572
  • 4
  • 10
5

In a similar case with Cosmos DB, I was able to set all properties to Camel case for my objects at the class declaration level, as in:

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

    public string UserName { get; set; }
}

This is how you tell NewtonSoft.Json to use Camel case for serializing.

Evren Kuzucuoglu
  • 3,781
  • 28
  • 51
4

In newer SDK's you can control the linq serialization in the following way:

container.GetItemLinqQueryable<T>(
    linqSerializerOptions: new CosmosLinqSerializerOptions
    {
        PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
    });

Where container is a Microsoft.Azure.Cosmos.Container.

wanton
  • 271
  • 1
  • 9