Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell DocumentDB SDK to use camelCase during linq query?

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?

like image 884
Jonas Stawski Avatar asked May 27 '16 18:05

Jonas Stawski


2 Answers

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.

like image 116
hsulriksen Avatar answered Jan 03 '23 04:01

hsulriksen


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.

like image 22
Evren Kuzucuoglu Avatar answered Jan 03 '23 06:01

Evren Kuzucuoglu