.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
相关产品推荐
相关产品推荐

