【发布时间】:2013-12-11 20:09:06
【问题描述】:
我目前正在研究 kendoUI 网格的服务器端分页和数据调用。我可以让网格执行服务器端事务,但我注意到即使全选或选择前 10 个,对 SQL 数据库的读取也是相同的。
当返回所有记录时 - 它会读取 104 的 sql profiler 当只返回 10 条记录时 - 它的 sql profiler 读取也为 104
用于返回数据的函数
public List<Employee> GetEmployees(int take, int skip)
{
return GetRepo<Employee>().All(null).where(p => p.IsDeleted == false).OrderBy(p => p.EmployeeNumber).Skip(10).Take(10).ToList();
}
当 LINQ 执行 10 条记录调用时,我使用了内置的 .Skip() 和 .Take() 函数。此方法需要 .OrderBy() 函数才能工作,并且我按表格上的 Id 列排序。
当您使用 .Skip() 和 .Take() 函数时,它会在用于一次调用所有记录的同一查询的外部包装前 10 个。请查看从 sql profiler 中提取的 sql 提取,
SELECT TOP (10) *
FROM ( SELECT *, row_number() OVER (ORDER BY [Project1].[EmployeeNumber] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[Id]
AS [Id],
[Extent1].[FirstName]
AS [FirstName],
[Extent1].[LastName]
AS [LastName],
[Extent2].[EmployeeNumber]
AS [EmployeeNumber],
[Extent2].[WeeklyHours]
AS [WeeklyHours],
'0X0X' AS [C1]
FROM [dbo].[Person]
AS [Extent1]
INNER JOIN [dbo].[Employee] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
WHERE 0 = [Extent2].[IsDeleted]
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 0
ORDER BY [Project1].[EmployeeNumber] ASC
该项目是一个 asp.net MVC 项目并使用框架 4.5。
有没有办法在不必扫描整个表的情况下返回 10 条记录?随着员工和人员表随时会增长到超过 100 万条活动记录。
如果这属于错误的类别,我很抱歉。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
标签: asp.net-mvc linq entity-framework linq-to-sql linq-to-entities