实体框架与 OrderBy 不同

sDi*_*ima 2 c# sql-server linq-to-entities entity-framework

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

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

    public string PartnerId { get; set; }

    // Other properties removed for clarity.
}
Run Code Online (Sandbox Code Playgroud)

并希望获得我订单的最后 20 个合作伙伴:

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

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

SELECT 
[Limit1].[PartnerId] AS [PartnerId]
FROM ( SELECT DISTINCT TOP (20) 
    [Extent1].[PartnerId] AS [PartnerId]
    FROM [dbo].[Orders] AS [Extent1]
)  AS [Limit1]
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*eer 5

您的问题是您在使用 Distinct 之前进行排序。根据您的评论,您说您无法订购,Id因为它不可用。然后,您必须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();
Run Code Online (Sandbox Code Playgroud)

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

我希望这有帮助。