2016-05-27 10 views
10

Betrachtet man das Dokument { "userName": "user1" } in der Benutzersammlung gespeichert und die folgenden User Klasse:Wie kann DocumentDB SDK angewiesen werden, camelCase während der linq-Abfrage zu verwenden?

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

Mit den folgenden JSON.net Einstellungen:

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

Wenn ich mit Linq als solche Abfrage:

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 ist null. Wenn Sie das Dokument ändern, um ein Pascal-Gehäuse zu erhalten, oder das POCO, um ein Camel-Gehäuse zu verwenden, wird das Problem gelöst. Natürlich möchte ich keines davon, da meine JSON-Objekte und C# -Objekte "standardisiert" sein sollen.

Wie kann ich sagen, das DocumentDB SDK meine Objekteigenschaftsnamen mit Kamel Gehäuse, ähnlich wie JSON.net abzubilden?

+0

Does [diese Antwort] (http://stackoverflow.com/a/25879197/272109) Ihr Problem lösen? Es ist nicht genau eine doppelte Frage, aber ich glaube, die veröffentlichte Antwort deckt ab, wonach Sie suchen. –

Antwort

15

Der DocumentDB LINQ-Provider abholen nicht die JsonConvert.DefaultSettings. Im Allgemeinen können Sie die DefaultSettings zum Steuern von camelCase verwenden, aber für die Eigenschaften, die Sie in einer LINQ-Where-Klausel verwenden möchten, muss der Name explizit mit dem JsonProperty-Attribut in Ihrem DTO festgelegt werden.

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

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

Obwohl ein bisschen langweilig und eine gute Quelle für Bugs, scheint es, Ihre einzige Option für jetzt zu sein.

+3

Wow, das ist ein Mist! –

+0

Dank für die Antwort, dies war die Tötung meiner Fragen – vip32

+0

Dank für die Antwort! Das hat meine Abfragen auch getötet. Momentan wechsle ich von LINQ-Ausdrücken zu SQL. –