EF返回的值不同于查询

juh*_*arr 12 c# sql-server entity-framework

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

var hierarchies = (from hierarchy in ctx.PolygonHierarchyViews
                   where hierarchy.DashboardId == dashboardId
                   select hierarchy);
Run Code Online (Sandbox Code Playgroud)

当我在调试器中检查该查询时,它显示以下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
Run Code Online (Sandbox Code Playgroud)

如果我在SQL Server Management Studio中运行该替代@p__linq__0dashboardId.我得到了这些结果.

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
Run Code Online (Sandbox Code Playgroud)

但是,迭代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
Run Code Online (Sandbox Code Playgroud)

请注意,第五行拥有ParentIdNULL,而不是5.这是我的工作是如何解决该问题.

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

这里奇怪的是,这导致IGroupinga Key值为5,但该组ParentId中的单个对象是null.

我正在尝试lookup从该查询中创建一个并且想要做

var lookup = hierarchies.ToLookup(h => h.ParentId);
Run Code Online (Sandbox Code Playgroud)

但是,因为实际上ParentId似乎并不总是具有正确的值而且我必须完成该组,我最终必须执行以下操作

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

为了使问题更加奇怪,如果我AsEnumerable在执行之前从查询的末尾删除它SelectMany,ToLookup它仍然会导致应该将ParentId5分组的实体分组null.

这是EF的某种类型的错误还是我在这里错过了一些东西?顺便说一下,我正在使用EF 6.1.3.

Sha*_*ist 2

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

我注意到有问题的行 (#5) 几乎与行 #2 完全匹配。我认为您有除“ParentId”之外的某些/所有列的复合键。

         DashboardId     CurrentId  Type  Name       ParentId
Row #2   4               6          2     Market     NULL
Row #5   4               6          2     Market     5
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,实体框架在呈现数据时比 SQL Server 更严格地遵守这些规则。

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