首页 > 解决方案 > Telerik:生成的 SQL 与示例项目不同

问题描述

我正在使用 Progress® Kendo UI® Grid for ASP.NET MVC 来显示类别表中的数据

Telerik 示例应用程序和我的应用程序上生成的 SQL 代码不同(注意:Telerik(2017.1.223.545) 和 .net framework(4.5.1) 所有版本在两个项目中都相同)

为什么在我的应用程序中生成不同的 SQL?我希望我的应用程序以相同的方式生成,以解决其他具有大量数据的项目中的性能问题。

我的应用程序:

public ActionResult ApplicationUserRole_Read([DataSourceRequest] DataSourceRequest request)
        {
            NorthwindEntities context = new NorthwindEntities();
            context.Categories.ToDataSourceResult(request);
            return Json("nothing");                  
        }

我的应用程序(生成的 SQL):

2019-08-20 12:46:22,320 [54] INFO RollingFileDBAppender - SELECT 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[CategoryName] AS [CategoryName], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Picture] AS [Picture]
    FROM [dbo].[Categories] AS [Extent1]
    ORDER BY [Extent1].[CategoryID] ASC
    OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 

例子:

public ActionResult Paging_Categories([DataSourceRequest] DataSourceRequest request)
        {
            var northwind = new SampleEntities();
            northwind.Categories.ToDataSourceResult(request);
            return Json("nothing");
        }

示例(生成的 SQL):

2019-08-20 12:19:10,952 [26] INFO Kendo.Mvc.Examples.Models.SampleEntities+<>c line 25 - SELECT TOP (10) 
    [Extent1].[CategoryID] AS [CategoryID], 
    [Extent1].[CategoryName] AS [CategoryName], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Picture] AS [Picture]
    FROM ( SELECT [Extent1].[CategoryID] AS [CategoryID], [Extent1].[CategoryName] AS [CategoryName], [Extent1].[Description] AS [Description], [Extent1].[Picture] AS [Picture], row_number() OVER (ORDER BY [Extent1].[CategoryID] ASC) AS [row_number]
        FROM [dbo].[Categories] AS [Extent1]
    )  AS [Extent1]
    WHERE [Extent1].[row_number] > 0
    ORDER BY [Extent1].[CategoryID] ASC

标签: entity-frameworkentity-framework-6telerik-gridtelerik-mvc

解决方案


两个项目中使用的实体框架不同。出于某种原因,当我使用实体框架版本 6.0.0 时,我们的 Web 应用程序的性能会更快

EF 在不同版本中生成 SQL 的方式不同。

Entity Framework - 6.0.0

SELECT TOP (15) 
    [Extent1].[EmpId] AS [EmpId], 
    [Extent1].[Age] AS [Age], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[Lastname] AS [Lastname]
    FROM ( SELECT [Extent1].[EmpId] AS [EmpId], [Extent1].[FirstName] AS [FirstName], [Extent1].[Lastname] AS [Lastname], [Extent1].[Age] AS [Age], row_number() OVER (ORDER BY [Extent1].[EmpId] ASC) AS [row_number]
        FROM [dbo].[Employees] AS [Extent1]
    )  AS [Extent1]
    WHERE [Extent1].[row_number] > 0
    ORDER BY [Extent1].[EmpId] ASC

Entity Framework - 6.1.3

SELECT 
    [Extent1].[EmpId] AS [EmpId], 
    [Extent1].[Age] AS [Age], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[Lastname] AS [Lastname]
    FROM [dbo].[Employees] AS [Extent1]
    ORDER BY [Extent1].[EmpId] ASC
    OFFSET 0 ROWS FETCH NEXT 15 ROWS ONLY 

Entity Framework - 6.2.0

SELECT 
    [Extent1].[EmpId] AS [EmpId], 
    [Extent1].[Age] AS [Age], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[Lastname] AS [Lastname]
    FROM [dbo].[Employees] AS [Extent1]
    ORDER BY row_number() OVER (ORDER BY [Extent1].[EmpId] ASC)
    OFFSET 0 ROWS FETCH NEXT 15 ROWS ONLY 

推荐阅读