CosmosDb не использует ContractResolver, предоставляемый при генерации запросов на выборку - PullRequest
0 голосов
/ 12 октября 2018

У меня есть проект, в котором я использую CosmosDb (SQL API) в качестве базы данных.Это проект .Net Core, и я использую последние стабильные пакеты NuGet.

Клиент документа создан следующим образом и использует пользовательский обработчик контрактов.

new DocumentClient(new Uri(settings.DatabaseUri), settings.DatabaseKey,
    new JsonSerializerSettings
    {
        ContractResolver = new PrivateSetterCamelCasePropertyNamesContractResolver(),
        Converters = new List<JsonConverter>
        {
           new EmailJsonConverter()
        }
     });

У меня есть коллекция с именем EmailAccount

public class EmailAccount : Entity
{
    public string Email { get; private set; }
    public string DisplayName { get; private set; }

    public EmailAccount(DDD.Core.ValueObjects.Email email,
        string displayName)
    {
        Email = email ?? throw new ArgumentNullException(nameof(email));
        DisplayName = string.IsNullOrWhiteSpace(displayName) ? throw new ArgumentNullException(nameof(displayName)) : displayName;
    }
}

Все свойства преобразуются в случай верблюда при сериализации, что все работает нормально.Но проблема в том, когда я пытаюсь отфильтровать документы.Сгенерированный SQL-запрос выглядит примерно так, когда я пытаюсь выполнить фильтрацию по электронной почте.

SELECT * FROM root WHERE (root["Email"] = "amila@iagto.com")

Проблема связана со случаем свойства (Email).Свойство в базе данных - email, но генератор запросов, похоже, не соответствует предоставленному ContractResolver и генерирует вышеуказанный SQL-запрос, который не возвращает никакого результата.

Если я поставлю [JsonProperty("email")] над свойством Email, запрос будет сгенерирован правильно.В любом случае, чтобы получить запрос, сгенерированный правильно, без использования атрибутов в классе Entity?

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 12 октября 2018

Вам нужно установить JsonSerializerSettings на уровне CreateDocumentQuery, чтобы LINQ to SQL мог его поднять.

Это свойство было добавлено в SDK в версиях 2.0.0+.

...