实体框架忽略OrderByDescending

时间:2014-07-16 11:52:27

标签: c# sql entity-framework

在我的SQL Server数据库中,我有以下层次结构

广告资源>数据集>资源>再现>不合格

其中每个都是一对多的关系。我想获得具有最近更新的一致性的三个数据集的id。符合性没有自己的日期,但需要修改父项的日期。因此,我创建了以下查询:

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?实体框架版本是6.0.1。

编辑:我有一个可以解决问题的解决方法,但是以不同的方式查询。我仍然对为什么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);

1 个答案:

答案 0 :(得分: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后,它并不能保证订购,请检查the documentation

  

预期的行为是它返回一个无序序列   来源中的独特物品。