DocumentClient.CreateDocumentQuery выдает ошибку не экземпляра при выполнении запроса

Я пишу веб-службу .NET, которая берет документы из базы данных CosmosDB. Я пишу функцию в другом проекте (который должен быть как можно более общим) для извлечения документа, чтобы WS мог его использовать.

Я использую DocumentClients функцию CreateDocumentQuery следующим образом:

public static async Task<T1> GetMyDocumentAsync<T1>(eDataBase databaseName, eCollection collectionName, eFields key, string val)
{
    var option = new FeedOptions { EnableCrossPartitionQuery = true };
    Uri uri = UriFactory.CreateDocumentCollectionUri(databaseName.ToString(), collectionName.ToString());
    IQueryable<T1> res = Client.CreateDocumentQuery<T1>(uri, option);
    document = res.AsEnumerable<T1>().FirstOrDefault();
}

Это отлично работает, возвращая первый документ в базе данных. Но изменив использование CreateDocumentQuery на это:

IQueryable<T1> res = Client.CreateDocumentQuery<T1>(uri, "SELECT * FROM c",option);

И завернутый в блок try-catch выдает исключение с InnerException, в котором указано:

Объект не установлен в экземпляр объекта.

Также некоторые поля исключений:

Data = {System.Collections.ListDictionaryInternal}

и

Error = {{ "code": "BadRequest",
           "message": "\r\nActivityId: SOMEGUID" }}

Запрос работает с этой коллекцией на портале Azure.

Свойства клиента, которые я использую:

ConnectionMode = Шлюз и Протокол = Https.

Любые идеи относительно того, почему это использование работает, а другое, использующее явную строку запроса, не будет? Я также пытался использовать объект SqlQuerySpec, и результат был таким же. Я не хочу использовать функцию Where(), так как хочу использовать универсальные типы. Ключевое слово async предназначалось для использования в будущем.


person Nexaspx    schedule 17.02.2019    source источник
comment
Ясно, что проблема в NRE, который вы получаете. Вам нужно отладить, чтобы увидеть, какой объект там имеет значение null. Вдобавок ко всему, стоит сказать, что так, как вы написали квест, вы на самом деле получаете полную коллекцию, прежде чем выбрать только первый предмет, поэтому у вас будут проблемы с производительностью. Кстати, было бы неплохо взглянуть на Cosmonaut, как он выглядит. может делать все, что вы пытаетесь закодировать.   -  person Nick Chapsas    schedule 17.02.2019
comment
@NickChapsas Спасибо, что подняли «Космонавт», мы подумаем о его тестировании. На данный момент я заинтересован в использовании класса Microsoft DocumentClient. Я пытался отладить его для нулей в течение некоторого времени, но я не нашел ничего полезного. Нулевая ссылка возникает, когда я пытаюсь взять первый элемент, преобразовать его в список или просто перечислить перечисляемое. Но опять же, когда я делаю то же самое без аргумента запроса, перечисление работает.   -  person Nexaspx    schedule 18.02.2019


Ответы (1)


Так что я решил это.

При создании коллекции, которую я пытался задать в вопросе, я заметил, что ключ раздела является обязательным. Во всех других моих коллекциях в космосе их не было. Поэтому я решил, что некоторые настройки должны отличаться для коллекций, в которых есть ключи разделов.

Часть, выбрасывающая нулевое исключение, перечисляла запрос документа. Судя по документации, использование функции выглядело нормально, поэтому я подумал, что проблема связана с CreateDocumentQuery. Это связано с тем, что он создал "ошибочный" объект с некоторыми нулевыми полями, и это может быть связано с изменением ключей раздела коллекции.

Поэтому я попытался обновить пакет Microsoft.Azure.DocumentDB для всего моего решения до последней стабильной версии (на данный момент 2.2.0), и тогда это просто сработало.

person Nexaspx    schedule 18.02.2019