假设我们有一个返回~30 000条记录的View,我们希望在Jquery Datatable中提供带分页的返回行,所有数据包括 - 完全有多少行,过滤后有多少(如果有的话)已被应用等等 - 填充是否有任何替代使用旁边:
ourQuery.Skip(currentPaginationSkipValue).Take(currentPaginationDisplayValue);
...
我问这个是因为Entity为Skip和Take生成了相当大的Sql:
SELECT TOP (10)
[Project1].[C1] AS [C1],
[Project1].[C2] AS [C2],
[Project1].[CentralId] AS [CentralId],
[Project1].[City] AS [City],
[Project1].[Concession] AS [Concession],
[Project1].[Group] AS [Group],
[Project1].[Id] AS [Id],
[Project1].[IsCooperating] AS [IsCooperating],
[Project1].[IsOffice] AS [IsOffice],
[Project1].[IsSalesLocked] AS [IsSalesLocked],
[Project1].[Name] AS [Name],
[Project1].[Nip] AS [Nip],
[Project1].[Phone] AS [Phone],
[Project1].[ProfileType] AS [ProfileType],
[Project1].[Regon] AS [Regon],
[Project1].[StatusType] AS [StatusType],
[Project1].[Street] AS [Street],
[Project1].[TerritorialDivision] AS [TerritorialDivision],
[Project1].[ZipCode] AS [ZipCode]
FROM ( SELECT [Project1].[Id] AS [Id], [Project1].[CentralId] AS [CentralId], [Project1].[Name] AS [Name], [Project1].[Concession] AS [Concession], [Project1].[Nip] AS [Nip], [Project1].[Regon] AS [Regon], [Project1].[IsSalesLocked] AS [IsSalesLocked], [Project1].[ProfileType] AS [ProfileType], [Project1].[StatusType] AS [StatusType], [Project1].[City] AS [City], [Project1].[ZipCode] AS [ZipCode], [Project1].[Street] AS [Street], [Project1].[Phone] AS [Phone], [Project1].[IsCooperating] AS [IsCooperating], [Project1].[TerritorialDivision] AS [TerritorialDivision], [Project1].[Group] AS [Group], [Project1].[IsOffice] AS [IsOffice], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], row_number() OVER (ORDER BY [Project1].[Id] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[CentralId] AS [CentralId],
[Extent1].[Name] AS [Name],
[Extent1].[Concession] AS [Concession],
[Extent1].[Nip] AS [Nip],
[Extent1].[Regon] AS [Regon],
[Extent1].[IsSalesLocked] AS [IsSalesLocked],
[Extent1].[ProfileType] AS [ProfileType],
[Extent1].[StatusType] AS [StatusType],
[Extent1].[City] AS [City],
[Extent1].[ZipCode] AS [ZipCode],
[Extent1].[Street] AS [Street],
[Extent1].[Phone] AS [Phone],
[Extent1].[IsCooperating] AS [IsCooperating],
[Extent1].[TerritorialDivision] AS [TerritorialDivision],
[Extent1].[Group] AS [Group],
[Extent1].[IsOffice] AS [IsOffice],
1 AS [C1],
STR( CAST( [Extent1].[Id] AS decimal(19,0))) AS [C2]
FROM (SELECT
[View_Customers].[Id] AS [Id],
[View_Customers].[Guid] AS [Guid],
[View_Customers].[CentralId] AS [CentralId],
[View_Customers].[ShortName] AS [ShortName],
[View_Customers].[Name] AS [Name],
[View_Customers].[IsActive] AS [IsActive],
[View_Customers].[CreatedAt] AS [CreatedAt],
[View_Customers].[UpdatedAt] AS [UpdatedAt],
[View_Customers].[Concession] AS [Concession],
[View_Customers].[Nip] AS [Nip],
[View_Customers].[Regon] AS [Regon],
[View_Customers].[Pesel] AS [Pesel],
[View_Customers].[IsSalesLocked] AS [IsSalesLocked],
[View_Customers].[IsVisitLocked] AS [IsVisitLocked],
[View_Customers].[CooperationType] AS [CooperationType],
[View_Customers].[ProfileType] AS [ProfileType],
[View_Customers].[CustomerType] AS [CustomerType],
[View_Customers].[StatusType] AS [StatusType],
[View_Customers].[Country] AS [Country],
[View_Customers].[City] AS [City],
[View_Customers].[ZipCode] AS [ZipCode],
[View_Customers].[Street] AS [Street],
[View_Customers].[BuildingNumber] AS [BuildingNumber],
[View_Customers].[FlatNumber] AS [FlatNumber],
[View_Customers].[Province] AS [Province],
[View_Customers].[District] AS [District],
[View_Customers].[Phone] AS [Phone],
[View_Customers].[Email] AS [Email],
[View_Customers].[Fax] AS [Fax],
[View_Customers].[IsCooperating] AS [IsCooperating],
[View_Customers].[TerritorialDivision] AS [TerritorialDivision],
[View_Customers].[Group] AS [Group],
[View_Customers].[ProfileTypeEntryCode] AS [ProfileTypeEntryCode],
[View_Customers].[IsOffice] AS [IsOffice]
FROM [dbo].[View_Customers] AS [View_Customers]) AS [Extent1]
WHERE [Extent1].[IsActive] = 1
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 20000
ORDER BY [Project1].[Id] ASC
这里似乎存在线性关系:
WHERE [Project1].[row_number] > 20000
20000值越大,查询越慢,例如当 - 而不是20000我使用200时,查询将在100毫秒内执行,对于2000它将需要800毫秒20000它将花费2000毫秒,并且200000它需要12秒钟等等。
问题是 - 是否有可能以某种方式使这个速度保持不变,所以不管它有多少必须跳过,它需要相同的时间?