我目前正在调查kendoUI网格的服务器端分页和数据调用。我可以让网格执行服务器端事务,但我注意到即使选择全部或选择前10位,对SQL数据库的读取也是相同的。
当返回所有记录时 - 它获得一个sql profiler读取为104 当只返回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万活跃记录。
如果这是错误的类别,我为此道歉。
非常感谢任何帮助。
感谢。
答案 0 :(得分:0)
尝试使用IQueryable或IEnumerable,而不是使用List。以下是一个例子:
public IQueryable<Employee> GetEmployees(int take, int skip)
{
return GetRepo<Employee>().All(null).where(p => p.IsDeleted == false).OrderBy(p => p.EmployeeNumber).Skip(10).Take(10);
}
注意:
IQueryable 旨在允许查询提供程序(例如,LINQ to SQL或实体框架等ORM)使用 查询中包含的表达式,用于将请求转换为另一个请求 格式。换句话说,LINQ-to-SQL查看了属性 您正在使用的实体以及您正在进行的比较 并实际创建一个SQL语句来表达(希望)一个 等效请求。
IEnumerable 比IQueryable更通用(尽管IQueryable的所有实例都实现了IEnumerable)并且只定义 一个序列。但是,有可用的扩展方法 可枚举的类,在其上定义一些查询类型运算符 接口并使用普通代码来评估这些条件。
列表只是一种输出格式,虽然它实现了IEnumerable,但与查询没有直接关系。
有关详细信息,请查看以下链接:
Differences between IQueryable, List, IEnumerator?
<强>更新强>
如果您在IRepository接口类中定义了一个过滤器,如下所示
IQueryable<T> Filter(Expression<Func<T, bool>> filter);
您可以更改GetEmployees方法,如下所示:
public IQueryable<Employee> GetEmployees(int take, int skip)
{
return GetRepo<Employee>().Filter(p => p.IsDeleted == false).OrderBy(p => p.EmployeeNumber).Skip(10).Take(10);
}
原因是延迟查询。