такое OData IQueryable асинхронно? - PullRequest
1 голос
/ 21 июня 2019

Я разрабатываю конечную точку OData для возврата списка элементов из базы данных.

Я возвращаю IQueryable и позволяю внешнему интерфейсу обрабатывать запросы / фильтрацию / расширение / разбиение по страницам через параметры запроса odata.

Рассмотрим следующий метод:

[ODataRoute]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IActionResult Get() {
    return Ok(context.Vendors.AsQueryable());
}

Я понимаю, что async на самом деле не нужен, потому что запрос здесь не материализуется.

В этом контексте, когда запрос материализуется?

Это делается асинхронно?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вы задали несколько вопросов. Я постараюсь ответить на них все и уточнить несколько вопросов.

Я понимаю, что асинхронность на самом деле не нужна

Асинхронизация никогда не бывает на самом делеНеобходим вопрос в том, принесет ли асинхронную пользу ваше приложение.Например, когда выполняется вызов в DbContext, существуют некоторые сетевые операции, которые требуют времени. Если вы не используете асинхронную передачу в течение этого времени, поток будет ожидать ответа, а не возвращаться в пул потоков для обработки других запросов.

Так что да, это не нужно, но может быть полезно.

В этом контексте, когда запрос материализуется?

Запросматериализованный (в промежуточном программном обеспечении) при доступе к конечной точке,

Это делается асинхронно?

Нет, когда вы передаете Queryable, вы просто откладываетедо тех пор, пока это не будет выполнено до сих пор, это все еще выполняется синхронно, вам нужно использовать шаблон async / await, чтобы делать что-то асинхронно

0 голосов
/ 24 июня 2019

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

...