Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 могут вызвать непредвиденные проблемы.