В моей базе данных SQL Server у меня есть следующая иерархия
Инвентарь> Наборы данных> Ресурсы> Извещения> Соответствия
где каждый из них является отношением от одного до многих. Я хотел получить идентификатор трех наборов данных с последним обновленным соответствием. Соответствие не имеет собственной даты, но принимает измененную дату родительского представления. Поэтому я создал следующий запрос:
var datasets = _inventoryRepository
.GetConformitiesIncludeAncestors()
.OrderByDescending(conformity => conformity.Rendition.Modified)
.Select(conformity => conformity.Rendition.Resource.DatasetID)
.Distinct()
.Take(3);
GetConformitiesIncludeAncestors просто возвращает конформности с включением следующим образом:
return _context.Conformities.Include(conformity => conformity.Rendition.Resource.Dataset.Inventory);
но оператор SQL, показанный при прохождении кода, не имеет предложения ORDER BY
.
SELECT
[Limit1].[DatasetID] AS [DatasetID]
FROM ( SELECT DISTINCT TOP (3)
[Extent3].[DatasetID] AS [DatasetID]
FROM [dbo].[Conformity] AS [Extent1]
INNER JOIN [dbo].[Rendition] AS [Extent2] ON [Extent1].[RenditionID] = [Extent2].[ID]
INNER JOIN [dbo].[Resource] AS [Extent3] ON [Extent2].[ResourceID] = [Extent3].[ID]
) AS [Limit1]
Почему OrderByDescending
игнорируется? Версия Entity Framework 6.0.1.
EDIT: У меня есть обходное решение, которое делает трюк, но путем запроса по-другому. Меня все еще интересует, почему OrderByDescending не имеет эффекта, поэтому останется открытым.
Мое обходное решение с использованием GroupBy
var datasets = _inventoryRepository
.GetConformitiesIncludeAncestors()
.GroupBy(conformity => conformity.Rendition.Resource.DatasetID)
.OrderByDescending(group => group.Max(conformity => conformity.Rendition.Modified))
.Take(3)
.Select(group => group.Key);
Если вы удалите Distinct, вы получите аналогичный результат.
var datasets = inventoryRepository
.GetConformitiesIncludeAncestors()
.OrderByDescending(comformity => comformity.Rendition.Modified)
.Select(comformity => comformity.Rendition.Resource.DatasetId)
//.Distinct()
.Take(3)
SELECT TOP (3)
[Extent3].[DatasetId] AS [DatasetId]
FROM [dbo].[Comformities] AS [Extent1]
INNER JOIN [dbo].[Renditions] AS [Extent2] ON [Extent1].[RenditionId] = [Extent2].[Id]
INNER JOIN [dbo].[Resources] AS [Extent3] ON [Extent2].[ResourceId] = [Extent3].[Id]
ORDER BY [Extent2].[Modified] DESC
Но после того, как вы добавите Distinct, это не гарантирует порядок, проверьте документацию.
Ожидаемое поведение заключается в том, что он возвращает неупорядоченную последовательность уникальных элементов в источнике.