实体框架与OrderBy不同

时间:2018-05-21 08:32:11

标签: c# sql-server entity-framework linq-to-entities

我使用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个合作伙伴?

1 个答案:

答案 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通常是增量的,但日期列通常是此查询的首选

我希望这会有所帮助。