Entity Framework 与 OrderBy 不同

Entity Framework Distinct with OrderBy

我使用 Entity Framework 6.2 并注意到 Distinct 忽略了我的 OrderBy 子句。 我有 class:

public class Order
{
    public int Id { get; set; }

    public string PartnerId { get; set; }

    // Other properties removed for clarity.
}

并且想要获得我订单的最后 20 个合作伙伴:

var list = db.Orders.AsNoTracking()
.OrderByDescending(obj => obj.Id)
.Select(x => x.PartnerId).Distinct().Take(20).ToList();

生成的 SQL 查询忽略了我的 OrderBy 子句:

SELECT 
[Limit1].[PartnerId] AS [PartnerId]
FROM ( SELECT DISTINCT TOP (20) 
    [Extent1].[PartnerId] AS [PartnerId]
    FROM [dbo].[Orders] AS [Extent1]
)  AS [Limit1]

如何准确获取订单中的最后 20 个合作伙伴?

您的问题是您在使用 Distinct 之前进行排序。根据您的评论,您说您不能按 Id 订购,因为它不可用。然后,您必须在 Select 查询中包含 Id,但是该 ID 是唯一的,因此不同的可能包含重复的合作伙伴条目。

您唯一的选择是使用 Id 字段通过聚合函数保留一些顺序(因为 ID 是递增的)。

var list = db.Orders.AsNoTracking()
    .GroupBy(order => order.PartnerId)
    .Select(group => new { 
        PartnerId = x.Key,
        LastId = x.Max(order => order.Id)
    })
    .OrderByDescending(x => x.LastId)
    .Take(20)
    .Select(x => x.PartnerId)
    .ToList();

这是有效的,因为 ID 通常是递增的,但是 日期列通常是此查询的首选

希望对您有所帮助。