EF和适当的分页 - 这有更好的方法吗?

时间:2014-10-28 06:26:09

标签: c# performance linq entity-framework

假设我们有一个返回~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秒钟等等。

问题是 - 是否有可能以某种方式使这个速度保持不变,所以不管它有多少必须跳过,它需要相同的时间?

0 个答案:

没有答案