2016-04-27 79 views
12

所以我剛碰到這個非常奇怪的場景,想知道是否有人可能知道問題是什麼。我有以下EF Linq查詢。EF返回不同於查詢的值

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中substituding @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 

但是,迭代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 

注意,第五行有NULLParentId,而不是5.這是我的工作是如何解決該問題。

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

這裏的奇怪的是,這導致IGrouping爲5的Key值,但該組中的單個對象的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。

+0

什麼是parentid?它是dashboardid嗎?即。該行的父母? dashboardrow id = 5是否存在? – Thorarins

+0

@ Thorarins'ParentId'是到'CurrentId'的鏈接。所以第三排是第二排的孩子。第五行應該是第一行的孩子,而不是頂級父母。 – juharr

+8

我很確定這是由視圖中的非唯一主鍵(如EF知道它)造成的。 –

回答

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可能導致意外問題。