2016-05-27 37 views
10

Considerando il documento { "userName": "user1" } memorizzato nella raccolta utente, e la seguente User classe:Come dire a DocumentDB SDK di usare camelCase durante la query linq?

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

con le seguenti impostazioni Json.NET:

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

Quando interrogo con LINQ come tale:

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 è nullo. Cambiare il documento per avere un involucro pascal o il POCO per usare un rivestimento di cammello risolve il problema. Ovviamente non voglio nessuno di quelli che voglio che i miei oggetti JSON e gli oggetti C# siano "standarizzati".

Come posso dire all'SDK di DocumentDB di mappare i nomi delle proprietà del mio oggetto utilizzando la carcassa di cammello, simile a JSON.net?

+0

Questa risposta (http://stackoverflow.com/a/25879197/272109) risolve il problema? Non è esattamente una domanda doppia, ma credo che la risposta pubblicata copra quello che stai cercando. –

risposta

15

Il provider DocumentDB LINQ non rileva le impostazioni JsonConvert.Default. In generale, è possibile utilizzare DefaultSettings per controllare camelCase, ma per quelle proprietà che si desidera utilizzare in una clausola LINQ Where deve avere il nome impostato esplicitamente utilizzando l'attributo JsonProperty sul proprio DTO.

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

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

Anche se un po 'noioso e una buona fonte di bug, sembra essere l'unica opzione per ora.

+3

wow, è un peccato! –

+0

grazie per la risposta, questo stava uccidendo le mie domande – vip32

+0

grazie per la risposta! questo stava uccidendo anche le mie domande. Per ora sto passando da espressioni LINQ a SQL. –