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 通常是递增的,但是 日期列通常是此查询的首选。
希望对您有所帮助。
我使用 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 通常是递增的,但是 日期列通常是此查询的首选。
希望对您有所帮助。