在我的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。
我使用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 :(得分: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。
预期的行为是它返回一个无序序列 来源中的独特物品。