我使用Entity Framework 6.2并注意到Distinct忽略了我的OrderBy子句。 我上课了:
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个合作伙伴?
答案 0 :(得分:3)
您的问题是您在使用Distinct之前正在排序。从你的评论中可以看出,你说Id
无法订购,因为它不可用。您必须在Select查询中包含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是唯一的,因此distinct可能包含重复的合作伙伴条目。
您唯一的选择是使用Id字段来保留某些订单(因为Ids是增量的)和聚合函数。
@foreach (var r in Model)
{
...etc
<td>
Html.ActionLink("Remove", "Remove", new { r.Sam, \\group name from ddl })
</td>
这适用于ID通常是增量的,但日期列通常是此查询的首选。
我希望这会有所帮助。