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 个合作伙伴?
您的问题是您在使用 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 通常是增量的,但此查询通常首选日期列。
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
2816 次 |
| 最近记录: |