2016-04-27 21 views
12

Quindi mi sono imbattuto in questo scenario molto strano e mi chiedevo se qualcuno potesse sapere qual è il problema. Ho la seguente query su Linq EF.EF restituisce valori diversi rispetto alla query

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

Quando ho ispezionare quella query nel debugger lo dimostra il seguente 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 

Se corro che in SQL Server Management Studio substituding @p__linq__0 con il valore di dashboardId. Ottengo questi risultati.

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 

Tuttavia i risultati dell'iterazione della query EF sono i seguenti.

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 

Si noti che la quinta fila ha un ParentId di NULL invece di 5. Questo è quanto ho lavorato per aggirare il problema.

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

La cosa strana è che questo si traduce in un IGrouping con un valore Key 5, ma la ParentId del singolo oggetto in quel gruppo è null.

sto cercando di creat un lookup da quella query e voleva fare proprio

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

Ma poiché la realtà ParentId non sembra di avere sempre il valore corretto e devo fare il gruppo da finisco per dover fare il seguente

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

per rendere le cose ancora più strano, se mi tolgo la AsEnumerable dalla fine della query prima di fare il SelectMany e ToLookup risulterà comunque nell'entità che dovrebbe avere un ParentId di 5 raggruppato in null.

Si tratta di un qualche tipo di errore con EF o mi manca qualcosa qui? BTW sto usando EF 6.1.3.

+0

cos'è parentid? è dashboardid? vale a dire. genitore della fila? esiste dashboardrow id = 5? – Thorarins

+0

@Thorarins 'ParentId' è un collegamento al' CurrentId'. Quindi la terza fila è il figlio del secondo.E la quinta riga dovrebbe essere un figlio della prima riga, non un genitore di primo livello. – juharr

+8

Sono abbastanza sicuro che ciò sia causato da una chiave primaria non univoca (come EF lo sa) nella vista. –

risposta

2

Ciò è causato da una chiave primaria non univoca . La tua domanda va bene.

Ho notato che la riga in questione (n. 5) corrisponde quasi completamente alla riga n. Suppongo tu abbia una chiave composta di alcune/tutte le colonne eccetto "ParentId".

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

Per qualsiasi motivo Entity Framework è più severo su sostenere tali norme di sql server è quando il rendering i dati.

Quello che devi fare è assicurati che i tuoi dati siano integri. Altrimenti il ​​framework Entity, o qualsiasi altro ORM, potrebbe causare problemi imprevisti.