2016-04-27 6 views
12

この非常に奇妙なシナリオを見つけただけで、問題が何であるか知っている人がいるかどうかは不思議でした。私は以下のEF Linqクエリを持っています。質問とは異なる値を返しているEF

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

私は、デバッガでそのクエリを検査するとき、私はSQL Server Management StudioでdashboardIdの値で@p__linq__0をsubstitudingことを実行した場合、それは、次の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 

を示しています。私はこれらの結果を得る。

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クエリを反復した結果は次のとおりです。 5行目は、これは私が問題を回避働いていた方法ですParentIdNULLの代わりに5を持っている

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 

ていることに注意してください。

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

ここで奇妙なことは、これが5のKey値とIGroupingをもたらすことがあるが、そのグループ内の単一のオブジェクトのParentIdnullあります。

私はそのクエリからlookupをクリートしようとするとちょうど

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

を行うにはしかし、実際にParentIdので、常に正しい値を持っているようだと私はしてグループを行う必要はありませんたかりましたよ私はSelectManyToLookupを行う前に、クエリの端からAsEnumerableを削除した場合、問題も見知らぬ人にするには、以下の

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

を行うために終わりますそれでもParentIdの5をnullにグループ化する必要があるエンティティが生成されます。

これはEFのバグですか?ここで何か不足していますか?私はEF 6.1.3を使用しています。

+0

parentidとは何ですか?それはダッシュボードですか?すなわち、行の親ですか? dashboardrow id = 5は存在しますか? – Thorarins

+0

@Thorarins 'ParentId'は' CurrentId'へのリンクです。だから3行目は2列目の子です。そして5番目の行は最上位の親ではなく、最初の行の子でなければなりません。 – juharr

+8

これは、ビュー内で一意でない主キー(EFが知っている)が原因であると確信しています。 –

答えて

2

これは、一意でない主キーによって引き起こされます。あなたの質問は大丈夫です。

問題の行(#5)が行#2とほぼ完全に一致することに気付きました。 「ParentId」以外の列の一部またはすべての複合キーがあると思います。 データをレンダリングするとき、エンティティフレームワークは、SQLサーバーよりも、これらのルールを守ることについて、より厳格である、何らかの理由

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

です。

あなたのデータに整合性があることを確認してくださいそれ以外のエンティティフレームワーク、または他のORMは予期しない問題を引き起こす可能性があります。

関連する問題