简体   繁体   中英

Entity Framework ignoring OrderByDescending

In my SQL Server database I have the following hierarchy

Inventory > Datasets > Resources > Renditions > Conformities

where each is a one to many relationship. I wanted to get the id of the three datasets with the most recently updated conformity. Conformity doesn't have its own date but takes the modified date of the parent rendition. I therefore created the following query:

var datasets = _inventoryRepository
    .GetConformitiesIncludeAncestors()
    .OrderByDescending(conformity => conformity.Rendition.Modified)
    .Select(conformity => conformity.Rendition.Resource.DatasetID)
    .Distinct()
    .Take(3);

GetConformitiesIncludeAncestors is simply returning the conformities with includes as follows:

return _context.Conformities.Include(conformity => conformity.Rendition.Resource.Dataset.Inventory);

but the SQL statement shown when stepping through the code doesn't have an ORDER BY clause.

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]

Why is OrderByDescending being ignored? Entity Framework version is 6.0.1.

EDIT: I have a workaround that does the trick, but by querying in a different way. I'm still interested in why the OrderByDescending had no effect so will leave open.

My workaround using 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);

If you remove the Distinct, you should get similar result like this.

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

But after you add the Distinct, it doesn't guarantee the ordering, check the documentation .

The expected behavior is that it returns an unordered sequence of the unique items in source.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM