EF Core DbContext, где Async - PullRequest
       1

EF Core DbContext, где Async

0 голосов
/ 24 марта 2020

Я пытаюсь выполнить запрос, содержащий WHERE в качестве функции Asyn c. Точно так же, как при использовании действия FirstAsync, но нет WhereAsync, поэтому мне было интересно, есть ли какой-нибудь обходной путь.

У меня есть объект ApplicationRepository с функцией GetEntitiesAsync, и я попробовал это:

public async Task<IEnumerable<TEntity>> GetEntitiesAsync<TEntity>(Func<TEntity, bool> selector) where TEntity : class => 
            await _context.Set<TEntity>().Where(selector).AsQueryable().ToArrayAsync();

Однако эта строка кода вызывает исключение:

System.InvalidOperationException: The source IQueryable doesn't implement IAsyncEnumerable<OneStopApp.Models.CustomForm>. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Предложение Where на самом деле ничего не делает, это отложенное выполнение. Вы можете просто использовать FirstAsync, ToListAsync или ToArrayAsync с Where.

В вашем коде вы должны удалить часть AsQueryable(). Без него у вас все будет в порядке:

await _context.Set<TEntity>().Where(selector).ToArrayAsync();

И да, вы должны использовать Expresion вместо Func. Возможно, DbSet или DbContext не предлагают перегрузки для Where, которая принимает Func. На самом деле это довольно часто.

0 голосов
/ 24 марта 2020

Существует метод ToListAsync, который можно вызывать асинхронно для получения данных.

var list = await db.Accounts.Where(x => true).ToListAsync();

Извлечение данных занимает большую часть времени, поэтому асинхронное c отсутствует на Where метод, но это методы, которые получают данные, такие как ToArrayAsync или FirstAsync.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...