Entity Framework игнорирует OrderByDescending

1

В моей базе данных 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);
  • 0
    Работает ли это, если вы перемещаете OrderByDescending после Distinct?
  • 0
    @KenTucker, к сожалению, нет, так как к этому моменту Select уже преобразовал результаты в IQueryable <int>.
Показать ещё 4 комментария
Теги:
entity-framework

1 ответ

2
Лучший ответ

Если вы удалите 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, это не гарантирует порядок, проверьте документацию.

Ожидаемое поведение заключается в том, что он возвращает неупорядоченную последовательность уникальных элементов в источнике.

  • 0
    Принятие этого ответа обусловлено ссылкой и цитатой с объяснением причины. Тем не менее, для всех, кто читает ответ, имейте в виду, что удаление Distinct перед тем, как взять, изменит результаты, которые вы получите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню