Неоднозначный вызов при использовании метода расширения LINQ на DbSet <T> - PullRequest
2 голосов
/ 22 февраля 2020

Я использую запрос LINQ для DbSet<T>:

await _dbContext.Users.AnyAsync(u => u.Name == name);

Однако компилятор выдает следующую ошибку:

Error CS0121: The call is ambiguous between the following methods or properties:
'System.Linq.AsyncEnumerable.AnyAsync<TSource>(System.Collections.Generic.IAsyncEnumerable<TSource>, System.Func<TSource, bool>)' and
'Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.AnyAsync<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource, bool>>)'

Аналогичная проблема также возникает с другим LINQ методы расширения, например .Where().

Я использую EF.Core 3.1 и у меня установлен пакет System.Linq.Async. Как мне исправить эту проблему?

1 Ответ

5 голосов
/ 22 февраля 2020

Эта проблема вызвана сочетанием использования пакета System.Linq.Async и класса DbSet<TEntity>, который реализует как IQueryable<TEntity>, так и IAsyncEnumerable<TEntity>.

. В этой ситуации импорт пространств имен System.Linq и Microsoft.EntityFrameworkCore приводит к определению конфликтующих методов расширения. К сожалению, избежать импорта одного из них, как правило, практически невозможно.

Такое поведение присутствует начиная с EF.Core 3.0 и обсуждается в этой проблеме .

Как В результате EF.Core 3.1 добавляет две вспомогательные функции AsAsyncEnumerable() и AsQueryable(), которые явно возвращают IAsyncEnumerable<TEntity> соответственно IQueryable<TEntity>.

Таким образом, пример кода исправляется путем вызова требуемой функции устранения неоднозначности:

await _dbContext.Users.AsQueryable().AnyAsync(u => u.Name == name);

или

await _dbContext.Users.AsAsyncEnumerable().AnyAsync(u => u.Name == name);
...