LINQ to实体排序不正确

本文关键字:不正确 排序 实体 to LINQ | 更新日期: 2023-09-27 18:25:21

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

(以下为简化版本)

类别:

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;
}

此代码在控制器中调用函数。CCD_ 6和CCD_。

public ActionResult POList([DataSourceRequest]DataSourceRequest request)
{
    var pos = _poService.GetAllPOs();
    DataSourceResult result = pos.ToDataSourceResult(request, o => PreparePOModelForList(o));
    return Json(result);
}

针对DB的实际查询(由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

LINQ to实体排序不正确

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