我正在使用 EF 4.3.1 ...刚刚升级到 4.4(问题仍然存在),并使用EF 4.x DbContext Generator生成的数据库优先 POCO 实体。我有以下名为“Wiki”的数据库(用于创建表和数据的 SQL 脚本在此处):
编辑 wiki 文章时,不是更新其记录,而是将新修订作为新记录插入,修订计数器增加。在我的数据库中有一个作者,“John Doe”,它有两篇文章,“文章 A”和“文章 B”,其中文章 A 有两个版本(1 和 2),但文章 B 只有一个版本。
我禁用了延迟加载和代理创建(这是我与 LINQPad 一起使用的示例解决方案)。我想获取由名字以“John”开头的人创建的文章的最新版本,所以我执行以下查询:
Authors.Where(au => au.Name.StartsWith("John"))
.Select(au => au.Articles.GroupBy(ar => ar.Title)
.Select(g => g.OrderByDescending(ar => ar.Revision)
.FirstOrDefault()))
这会产生错误的结果,并且只检索第一篇文章:
通过替换为以下查询中的结果,对.FirstOrDefault()
查询进行小的更改:.Take(1)
Authors.Where(au => au.Name.StartsWith("John"))
.Select(au => au.Articles.GroupBy(ar => ar.Title)
.Select(g => g.OrderByDescending(ar => ar.Revision)
.Take(1)))
令人惊讶的是,这个查询产生了正确的结果(尽管有更多的嵌套):
我假设 EF 生成的 SQL 查询略有不同,一个只返回一篇文章的最新版本,另一个返回所有文章的最新版本。两个查询生成的丑陋 SQL 仅略有不同(比较:.FirstOrDefault() 的 SQL 与 .Take( 1 ) 的 SQL),但它们都返回正确的结果:
.FirstOrDefault()
.Take(1)
(为了便于比较,重新排列了列顺序)
因此,罪魁祸首不是生成的 SQL,而是 EF 对结果的解释。为什么 EF 将第一个结果解释为单个Article
实例,而将第二个结果解释为两个Article
实例?为什么第一个查询返回不正确的结果?
编辑:我已经打开了关于 Connect的错误报告。如果您认为解决此问题很重要,请点赞。