所以我刚刚遇到了这个奇怪的情况,并想知道是否有人可能知道问题是什么。我有以下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,但该组中单个对象的IGrouping
为Key
。
我试图从该查询中创建ParentId
,并且只是想做
null
但是因为实际上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);
之前从查询末尾删除了AsEnumerable
,那么它仍然会导致应该拥有{的实体{1}}中的{1}}被归为SelectMany
。
这是EF的某种类型的错误还是我错过了什么?顺便说一句,我使用的是EF 6.1.3。
答案 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可能会导致意外问题。