EF возвращает разные значения, чем запрос
Итак, я просто столкнулся с этим очень странным сценарием и задавался вопросом, может ли кто-нибудь узнать, в чем проблема. У меня есть следующий запрос EF Linq.
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 подстановкой @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.
Ответы
Ответ 1
Это вызвано неисторическим первичным ключом. Ваш запрос в порядке.
Я заметил, что строка, о которой идет речь (# 5), почти полностью совпадает со строкой №2. Я считаю, что у вас есть составной ключ для некоторых/всех столбцов, кроме "ParentId".
DashboardId CurrentId Type Name ParentId
Row #2 4 6 2 Market NULL
Row #5 4 6 2 Market 5
По какой-либо причине инфраструктура Entity более строго относится к соблюдению этих правил, чем сервер sql - при рендеринге данных.
Что вам нужно сделать, это убедиться, что ваши данные имеют целостность. В противном случае инфраструктура Entity или любая другая ORM могут вызвать непредвиденные проблемы.