在DbSet上使用LINQ扩展方法时的歧义调用

问题描述 投票:0回答:1

我正在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软件包。如何解决此问题?

c# linq entity-framework-core ambiguous entity-framework-core-3.1
1个回答
0
投票

此问题是由同时使用System.Linq.AsyncDbSet<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);
© www.soinside.com 2019 - 2024. All rights reserved.