剑道网格如何';s更改EF语句的DataSourceRequest
本文关键字:更改 EF 语句 DataSourceRequest 网格 | 更新日期: 2024-10-22 18:13:28
我有一个Kendo网格,它在控制器中读取以下HttpPost操作:
[HttpPost]
public JsonResult RetrieveBatches([DataSourceRequest] DataSourceRequest request) {
var original = this._emsRepo.RetrieveDboT_EmsBatches().ToList();
var changed = this._emsRepo.RetrieveDboT_EmsBatches().ToDataSourceResult(request);
return this.Json(changed);
}
我有一个实现以下内容的存储库类:
public IEnumerable<DboT_EmsBatches> RetrieveDboT_EmsBatches() {
return this._con.DboT_EmsBatches.OrderByDescending(x=> x.EmsBatchID);
}
在哪里_con是包含以下内容的上下文:
public DbSet<DboT_EmsBatches> DboT_EmsBatches { get; set; }
通过重写OnModelCreating()在上下文中使用配置行:
modelBuilder.Configurations.Add(new DboT_EmsBatchesConfiguration());
它是一个简单的配置文件,映射到数据库表:
public DboT_EmsBatchesConfiguration() {
this.HasKey(t => t.EmsBatchID).ToTable("dbo.T_EmsBatches");
}
我不明白ToDataSourceResult(请求)将如何更改EF发送的IEnumerable甚至select语句?
原始查询将执行sql语句:
SELECT
[Extent1].[EmsBatchID] AS [EmsBatchID],
[Extent1].[Description] AS [Description],
[Extent1].[InsertedTimeStamp] AS [InsertedTimeStamp]
FROM [dbo].[T_EmsBatches] AS [Extent1]
ORDER BY [Extent1].[EmsBatchID] DESC
这是我想要的正确查询。
更改后的请求将发送一条SQL语句:
SELECT
[Extent1].[EmsBatchID] AS [EmsBatchID],
[Extent1].[Description] AS [Description],
[Extent1].[InsertedTimeStamp] AS [InsertedTimeStamp]
FROM ( SELECT [Extent1].[EmsBatchID] AS [EmsBatchID], [Extent1].[Description] AS [Description], [Extent1].[InsertedTimeStamp] AS [InsertedTimeStamp], row_number() OVER (ORDER BY [Extent1].[EmsBatchID] ASC) AS [row_number]
FROM [dbo].[T_EmsBatches] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 0
ORDER BY [Extent1].[EmsBatchID] ASC
我不知道为什么它会更改select语句,因为我的存储库返回的是IEnumerable而不是IQueryable?
DataSourceRequest
对象和ToDataSourceResult
函数都是用于实现服务器端分页的Kendo.DynamicLinq
扩展的一部分。
using Kendo.DynamicLinq;
ToDataSourceResult
所做的是修改查询以收集诸如total之类的分页信息,并且只获取需要显示的行。然后,它将所有这些打包到一个DataSourceResult
对象中,并将其传递给Json
函数。
这篇博客文章描述了扩展的工作原理。