EF返回的值不同于查询

时间:2016-04-27 12:31:28

标签: c# sql-server entity-framework

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

Set newValueMap = Nothing

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

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

如果我在SQL Server Management Studio中运行该代码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 ,其值为@p__linq__0。我得到了这些结果。

dashboardId

然而,迭代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     5
4               7          3     SubMarket  6
4               8          4     ZipCode    7

请注意,第五行的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 ParentId而不是5.这就是我解决问题的方法。

NULL

这里奇怪的是,这导致var hierarchies = (from hierarchy in ctx.PolygonHierarchyViews where hierarchy.DashboardId == dashboardId group hierarchy by hierarchy.ParentId into grp select grp).AsEnumerable(); 的{​​{1}}值为5,但该组中单个对象的IGroupingKey

我试图从该查询中创建ParentId,并且只是想做

null

但是因为实际上lookup似乎总是没有正确的价值而且我必须按照我最终必须执行以下操作来完成

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

为了使问题更加奇怪,如果我在执行ParentIdvar lookup = hierarchies.SelectMany(x => x.Select(y => new { x.Key, View = y })) .ToLookup(h => h.Key, h => h.View); 之前从查询末尾删除了AsEnumerable,那么它仍然会导致应该拥有{的实体{1}}中的{1}}被归为SelectMany

这是EF的某种类型的错误还是我错过了什么?顺便说一句,我使用的是EF 6.1.3。

1 个答案:

答案 0 :(得分:2)

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

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

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

无论出于何种原因,当呈现数据时,实体框架对于维护这些规则的要求比sql server更严格。

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