我正在DbSet<T>
上使用LINQ查询:
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
软件包。如何解决此问题?
此问题是由同时使用System.Linq.Async
和DbSet<TEntity>
的IQueryable<TEntity>
程序包和IAsyncEnumerable<TEntity>
类的组合引起的。
在这种情况下,导入名称空间System.Linq
和Microsoft.EntityFrameworkCore
导致冲突的扩展方法的定义。不幸的是,避免导入其中之一通常是不现实的。
此行为从EF.Core 3.0开始,并在this issue中进行了讨论。
因此,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);