2016-04-27 5 views
12

Так что я просто столкнулся с этим очень странным сценарием и задавался вопросом, может ли кто-нибудь узнать, в чем проблема. У меня есть следующий запрос 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.

+0

Что такое родитель? это приборная панель? то есть. родитель строки? существует ли dashboardrow id = 5? – Thorarins

+0

@Thorarins 'ParentId' - это ссылка на' CurrentId'. Итак, третья строка - это ребенок второго.И пятая строка должна быть дочерним элементом первой строки, а не родителем верхнего уровня. – juharr

+8

Я уверен, что это вызвано неисторическим первичным ключом (как это известно EF) в представлении. –

ответ

2

Это связано с нестандартным первичным ключом . Ваш запрос в порядке.

Я заметил, что строка, о которой идет речь (# 5), почти полностью совпадает со строкой №2. Я считаю, что у вас есть составной ключ для некоторых/всех столбцов, кроме «ParentId».

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

По какой причине рамки сущности является более строгим о поддержании этих правил, чем SQL-сервера, когда рендеринга данных.

Что вам нужно сделать, это убедитесь, что ваши данные имеют целостность. В противном случае инфраструктура Entity или любой другой ORM могут вызвать непредвиденные проблемы.

Смежные вопросы