我正在使用实体框架实现服务器端分页并具有以下代码
DbQuery<T> query = Context.Set<T>();
query = IncludeNavigationProperties(query, includedProperties);
var result = query.OrderBy(arg => arg.DatabaseId)
.Skip((pageNumber - 1)*pageSize)
.Take(pageSize).ToList();
这会生成一个只查询必要数据的 SQL(使用 SQL Server Profiler 检查)
SELECT TOP (21)
[Extent1].[DatabaseId] AS [DatabaseId],
...[other props here]...
FROM ( SELECT [Extent1].[DatabaseId] AS [DatabaseId], ...[other props here]..., row_number() OVER (ORDER BY [Extent1].[DatabaseId] ASC) AS [row_number]
FROM [dbo].[Table] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 84
ORDER BY [Extent1].[DatabaseId] ASC
然后我决定在更多场景中重用这个方法,并keySelector
作为外部变量传递:
DbQuery<T> query = Context.Set<T>();
query = IncludeNavigationProperties(query, includedProperties);
var result = query.OrderBy(keySelector)
.Skip((pageNumber - 1)*pageSize)
.Take(pageSize).ToList();
在哪里
Func<T, int> keySelector = arg => arg.DatabaseId;
但它突然生成以下 SQL 查询:
SELECT
[Extent1].[DatabaseId] AS [DatabaseId],
...[other props here]...
FROM [dbo].[Table] AS [Extent1]
据我了解,它从 Table 中查询所有数据,然后在服务器上对其进行处理。
所以,我有两个问题:
- 为什么查询会改变?
- 我该如何修复它(能够改变
keySelector
和只查询必要的数据)?