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__0值dashboardId.我得到了这些结果.
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)
请注意,第五行拥有ParentId的NULL,而不是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.
这是由非唯一主键引起的。你的查询没问题。
我注意到有问题的行 (#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 可能会导致意外问题。
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |