EF Core 5出现Where方法调用歧义错误,如何无需大量修改代码解决?
错误触发原因
这个CS0121歧义报错的核心原因是你的代码中同时引入了System.Linq和System.Linq.Async两个命名空间:
- EF Core的
DbSet<T>类型同时实现了IQueryable<T>和IAsyncEnumerable<T>两个接口 System.Linq下的Queryable.Where扩展方法接收IQueryable<T>类型参数,入参是表达式树Expression<Func<TSource, bool>>System.Linq.Async下的AsyncEnumerable.Where扩展方法接收IAsyncEnumerable<T>类型参数,入参是委托Func<TSource, bool>
两个方法对DbSet<T>的匹配优先级完全一致,编译器无法判定该调用哪个方法,因此抛出歧义错误。该问题通常是近期新增依赖包、开启隐式引用、或手动新增using System.Linq.Async;全局引用导致的。
无需批量修改业务代码的解决方案
方案1:移除多余的System.Linq.Async引用(优先推荐)
如果你的业务代码中没有直接用到IAsyncEnumerable相关的Linq扩展方法,直接全局搜索所有代码文件中的using System.Linq.Async;语句,删除即可解决全部歧义问题,不需要修改任何业务访问代码。
如果你的项目开启了隐式Usings(.NET 6+项目常见),是第三方包自动引入了System.Linq.Async的隐式引用,可以在项目的.csproj文件中添加如下配置主动移除该隐式引用:
<ItemGroup> <Using Remove="System.Linq.Async" /> </ItemGroup>
方案2:局部引用System.Linq.Async
如果确实有少量业务场景需要用到System.Linq.Async的扩展方法,不要将using System.Linq.Async;放在全局或公共文件头部,仅在需要使用该命名空间方法的代码文件中单独添加引用即可,不会影响EF Core的常规访问代码。
方案3:使用别名区分两个命名空间
如果两个命名空间的方法都需要高频使用,可以在项目的全局Usings文件中为两个命名空间设置别名,需要调用对应方法时显式指定即可:
// GlobalUsings.cs 中添加 using EFLinq = System.Linq.Queryable; using AsyncLinq = System.Linq.Async;
你当前使用的加AsQueryable()的方案可以临时解决问题,但属于侵入式修改,不推荐批量使用,上述方案均不需要修改现有业务代码即可解决问题。
内容的提问来源于stack exchange,提问作者S. Aziz Kazdal
相关产品推荐
相关产品推荐

