EF返回的值不同于查询

所以我只是遇到了这个奇怪的情况,并想知道是否有人可能知道问题是什么。 我有以下EF Linq查询。

var hierarchies = (from hierarchy in ctx.PolygonHierarchyViews where hierarchy.DashboardId == dashboardId select hierarchy); 

当我在调试器中检查该查询时,它显示以下SQL

 SELECT [Extent1].[DashboardId] AS [DashboardId], [Extent1].[CurrentId] AS [CurrentId], [Extent1].[PolygonTypeId] AS [PolygonTypeId], [Extent1].[DisplayName] AS [DisplayName], [Extent1].[ParentId] AS [ParentId] FROM [dbo].[PolygonHierarchyView] AS [Extent1] WHERE [Extent1].[DashboardId] = @p__linq__0 

如果我在SQL Server Management Studio中运行它, @p__linq__0使用dashboardId的值替换@p__linq__0 。 我得到了这些结果。

 DashboardId CurrentId Type Name ParentId 4 5 1 Region NULL 4 6 2 Market NULL 4 7 3 SubMarket 6 4 8 4 ZipCode 7 4 6 2 Market 5 4 7 3 SubMarket 6 4 8 4 ZipCode 7 

但是,迭代EF查询的结果如下。

 DashboardId CurrentId Type Name ParentId 4 5 1 Region NULL 4 6 2 Market NULL 4 7 3 SubMarket 6 4 8 4 ZipCode 7 4 6 2 Market NULL 4 7 3 SubMarket 6 4 8 4 ZipCode 7 

请注意,第五行的ParentIdNULL而不是5.这就是我解决问题的方法。

 var hierarchies = (from hierarchy in ctx.PolygonHierarchyViews where hierarchy.DashboardId == dashboardId group hierarchy by hierarchy.ParentId into grp select grp).AsEnumerable(); 

这里奇怪的是,这导致了一个Key值为5的IGrouping ,但该组中单个对象的ParentIdnull

我正在尝试从该查询创建lookup ,并希望这样做

 var lookup = hierarchies.ToLookup(h => h.ParentId); 

但是因为实际的ParentId似乎并不总是具有正确的值而且我必须按照我最终必须执行以下操作

 var lookup = hierarchies.SelectMany(x => x.Select(y => new { x.Key, View = y })) .ToLookup(h => h.Key, h => h.View); 

更重要的是,如果我在执行SelectManyToLookup之前从查询末尾删除AsEnumerable ,它仍然会导致应该将ParentId为5的实体归类为null

这是EF的某种类型的错误还是我在这里遗漏了什么? 顺便说一下,我正在使用EF 6.1.3。

这是由非唯一主键引起的。 你的查询没问题。

我注意到有问题的行(#5)几乎完全与第2行匹配。 我估计除了’ParentId’之外,你有一些/所有列的复合键。

  DashboardId CurrentId Type Name ParentId Row #2 4 6 2 Market NULL Row #5 4 6 2 Market 5 

无论出于何种原因,entity framework在渲染数据时比sql server更严格地维护这些规则。

您需要做的是确保您的数据具有完整性。否则,entity framework或任何其他ORM可能会导致意外问题。