LINQ to Entities 排序不正确

LINQ to Entities not ordering correctly

我有一个运行有点复杂的 LINQ 查询的函数,但我已经验证下面的简化代码也有问题。我特别告诉查询按 RequiredDate 排序,这是 DateTime。然而,这完全被忽略了——排序实际上是由另一个 属性、PONumber 进行的。数据库都是随机测试数据,所以除了 Id 列之外没有任何排序。我不确定为什么使用其他 属性 而不是我尝试排序的列。我使用 Kendo UI,因此 IEnumerable 在控制器中转换为 Kendo 类型,但 LINQ to Entities 查询 returns 的顺序不正确。是什么导致了这个问题?

(以下为简化版)

Class:

public partial class PurchaseOrder : BaseEntity
{
    public virtual int PONumber { get; set; }
    public virtual DateTime RequiredDate { get; set; }
}

映射:

public PurchaseOrderMap()
{
    ToTable("PurchaseOrder");
    HasKey(c => c.Id);
    Property(u => u.PONumber).IsRequired();
    Property(u => u.RequiredDate).IsRequired();
}

服务(获取数据):

public virtual IEnumerable<PurchaseOrder> GetAllPOs()
{
    var query = _poRepository.Table;
    query = query.Where(p => p.Shipment == null);

    query = query.OrderBy(p => p.RequiredDate);
    return query;
}

此代码在控制器中调用函数。 DataSourceRequestDataSourceResult 是 Kendo UI.

中的函数
public ActionResult POList([DataSourceRequest]DataSourceRequest request)
{
    var pos = _poService.GetAllPOs();
    DataSourceResult result = pos.ToDataSourceResult(request, o => PreparePOModelForList(o));

    return Json(result);
}

针对数据库的实际查询(由 SQL Profiler 提供)是:

SELECT 
    [Extent1].[Id] AS [Id],
    [Extent1].[PONumber] AS [PONumber],
    [Extent1].[RequiredDate] AS [RequiredDate],
    [Extent1].[LastUpdateDate] AS [LastUpdateDate],
    FROM    [dbo].[PurchaseOrder] AS [Extent1]
    ORDER BY [Extent1].[PONumber] ASC
    OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

基于 OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 我猜你在某个地方有一些额外的逻辑试图通过 Skip() 和 Take() 方法应用分页。我的猜测是你在那里做了一些你遗漏的额外排序。我无法根据您提供的代码证明这一点,但请尝试弄清楚是什么生成了您的 OFFSET ... FETCH NEXT ... 我想您会找到答案。