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.
cos'è parentid? è dashboardid? vale a dire. genitore della fila? esiste dashboardrow id = 5? – Thorarins
@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
Sono abbastanza sicuro che ciò sia causato da una chiave primaria non univoca (come EF lo sa) nella vista. –