使用 LINQ 扩展方法在 DbSet<T> 上时出现了模糊的调用错误。

58

我正在一个 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包。我该如何解决这个问题?

1个回答

117
所述问题是由使用System.Linq.Async包与DbSet<TEntity>类引起的。
由于DbSet<TEntity>实现了IQueryable<TEntity>IAsyncEnumerable<TEntity>,导入命名空间System.LinqMicrosoft.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);

只是好奇,你展示的这两种解决方法之间有差异(性能或其他方面)吗? - Greg Z.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接