剑道网格如何';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?

剑道网格如何';s更改EF语句的DataSourceRequest

DataSourceRequest对象和ToDataSourceResult函数都是用于实现服务器端分页的Kendo.DynamicLinq扩展的一部分。

using Kendo.DynamicLinq;

ToDataSourceResult所做的是修改查询以收集诸如total之类的分页信息,并且只获取需要显示的行。然后,它将所有这些打包到一个DataSourceResult对象中,并将其传递给Json函数。

这篇博客文章描述了扩展的工作原理。