You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中重写的Equals方法在FirstOrDefaultAsync内未被调用

问题原因解析

这是EF Core的LINQ查询机制导致的,核心区别在于查询是否在数据库端执行:

  • 当你用context.Istituti.FirstOrDefaultAsync(e => e.Equals(resource))时,EF Core会把这个Lambda表达式解析成表达式树,然后尝试转换成对应的SQL语句去数据库执行。但EF Core无法识别你自定义的Equals方法逻辑,没法把它转成数据库能理解的SQL,所以根本不会触发你重写的Equals方法,反而会用EF Core默认的实体相等规则(通常是主键匹配)来生成查询,自然达不到你预期的效果。

  • 而调用ToList()之后,数据已经被完整加载到内存中,变成了.NET内存对象集合。这时候遍历调用Equals,是直接对内存中的实体实例进行操作,完全属于.NET的本地代码执行,所以会正常触发你重写的Equals方法。

解决建议

如果要实现按Name字段匹配的查询,直接把条件写清楚就行:

context.Istituti.FirstOrDefaultAsync(e => e.Name == resource.Name)

这样EF Core能正确转换成SQL的WHERE Name = @p0语句,既符合你的业务逻辑,又能在数据库端高效执行。

内容的提问来源于stack exchange,提问作者Davide Vitali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:32:03