Так что я просто столкнулся с этим очень странным сценарием и задавался вопросом, может ли кто-нибудь узнать, в чем проблема. У меня есть следующий запрос 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__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
Однако результаты повторения запроса 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
Обратите внимание, что пятая строка имеет ParentId
из NULL
вместо 5. Это, как я работал вокруг этой проблемы.
var hierarchies = (from hierarchy in ctx.PolygonHierarchyViews
where hierarchy.DashboardId == dashboardId
group hierarchy by hierarchy.ParentId into grp
select grp).AsEnumerable();
Самое странное в том, что это приводит к IGrouping
с Key
значением 5, но ParentId
из одного объекта в этой группе null
.
Я пытаюсь с 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);
чтобы еще чужак, если я удалю AsEnumerable
с конца запроса перед выполнением SelectMany
и ToLookup
это все равно приведет к тому, что предприятие должно иметь ParentId
из 5, сгруппированных под null
.
Это какой-то тип ошибки с EF или я просто что-то пропустил? BTW Я использую EF 6.1.3.
Что такое родитель? это приборная панель? то есть. родитель строки? существует ли dashboardrow id = 5? – Thorarins
@Thorarins 'ParentId' - это ссылка на' CurrentId'. Итак, третья строка - это ребенок второго.И пятая строка должна быть дочерним элементом первой строки, а не родителем верхнего уровня. – juharr
Я уверен, что это вызвано неисторическим первичным ключом (как это известно EF) в представлении. –