C# ASP. NET Core Entity Framework Core Асинхронное сравнение ToQueryable - PullRequest
0 голосов
/ 24 апреля 2020

Я использую EfRepository<TEntity> для доступа к данным, и у меня есть DbSet<TEntity>. Я пытаюсь получить доступ к данным асинхронно, и мне нужно, чтобы это было как Queryable, и в настоящее время я использую это:

public virtual async Task<IQueryable<TEntity>> AllAsync()
{
    var list = await this.DbSet.ToListAsync();
    return list.AsQueryable();
}

Это на самом деле быстрее, чем при использовании DbSet синхронно?

Ответы [ 2 ]

4 голосов
/ 24 апреля 2020

Действительно ли это быстрее, чем синхронное использование DbSet?

На самом деле, намного, намного, намного медленнее. Это загрузит все сущности в память перед возвратом в память IQueryable.

Ваш дополнительный репозиторий второго уровня должен возвращать DbSet напрямую как IQueryable<T>. Вызывающий код определяет запрос и выполняет его как syn c или asyn c.

Многие написали обертки "generi c repository" для EF. Все они добавляют сложности, и большинство из них приносит больше вреда, чем пользы.

0 голосов
/ 24 апреля 2020

Как и большинство вещей, это зависит. Если вы работаете в консольном приложении и ваша цель - как можно быстрее полностью загрузить список объектов в память, синхронный вызов будет немного быстрее. Если вы выполняете подобные запросы в веб-приложении, вы должны планировать одновременное выполнение множества таких запросов. Темы являются ценным ресурсом в веб-приложении. Синхронный запуск запроса t ie создаст поток, который можно использовать для обработки других веб-запросов, пока ваш запрос блокирует ввод-вывод. Таким образом, вы можете максимизировать время до последнего байта, делая синхронный вызов, но вы можете максимизировать общую пропускную способность системы (и избежать истощения потоков) с помощью асинхронного вызова.

В конце вам, вероятно, потребуется измерить.

...