我有一个运行一个有点复杂的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;
}
此代码在控制器中调用函数。 DataSourceRequest
和DataSourceResult
是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
答案 0 :(得分:0)
基于OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY我猜你有一些额外的逻辑试图通过Skip()和Take()方法应用分页。我的猜测是你在那里做了一些你缺少的额外排序。我不能根据你给出的代码证明这一点,但是试着找出产生你的OFFSET的原因...... FETCH NEXT ......我怀疑你会找到答案。