代码之家  ›  专栏  ›  技术社区  ›  Howard Pinsley

为什么实体框架在生成SQL时忽略take()方法?

  •  2
  • Howard Pinsley  · 技术社区  · 15 年前

    我正在使用带有实体框架的.skip和.take方法。生成SQL时,将执行.skip调用。拿走不是。此代码:

            public IList<DocPullRun> GetDocRunsPaginated(int startRowIndex, int maximumRows) {
    
            Logger.Debug("GetDocRunsPaginated: startRowIndex: {0}, maximumRows: {1}", startRowIndex, maximumRows);
            Debug.Assert(startRowIndex >= 0);
            IOrderedQueryable<DocPullRun> sortedPulls = 
                from run in DB.DocPullRuns
                     .Include("DocumentPullDefinition")
                     .Include("DocumentPullDefinition.Case")
                     .Include("DocumentPullDefinition.DocCategory")
                     .Include("DocumentPullDefinition.Repository")
                     .Include("DocumentPullDefinition.Repository.ConcordanceRepository")
    
                 orderby run.PullStarted descending
                 select run;
    
            IQueryable<DocPullRun> query = sortedPulls.Skip(startRowIndex);
            if (maximumRows > 0)
                query.Take(maximumRows);
    
            return query.ToList();
        }
    

    结果如下所示(请注意,在此调用中,StartRowIndex为0,MaximumRows为 )WHERE子句包含WHERE[project1]。[row_number]>0(这是.skip部分),但我希望看到 选择前10名 但相反,只需看到一个选择。结果列表包含10个以上的元素。注意,我运行了SQL跟踪,看到SQL确实被延迟了,直到最后一行:query.tolist()才真正发送。这是某种类型的bug吗?

        SELECT 
    [Project1].[C1] AS [C1], 
    [Project1].[Id] AS [Id], 
    [Project1].[PullStarted] AS [PullStarted], 
    [Project1].[PullEnded] AS [PullEnded], 
    [Project1].[MatchedQuery] AS [MatchedQuery], 
    [Project1].[NewDocs] AS [NewDocs], 
    [Project1].[UpdatedDocs] AS [UpdatedDocs], 
    [Project1].[DeletedDocs] AS [DeletedDocs], 
    [Project1].[Errors] AS [Errors], 
    [Project1].[C2] AS [C2], 
    [Project1].[Id1] AS [Id1], 
    [Project1].[Requestor] AS [Requestor], 
    [Project1].[RequestTime] AS [RequestTime], 
    [Project1].[Query] AS [Query], 
    [Project1].[Enabled] AS [Enabled], 
    [Project1].[LastPullTime] AS [LastPullTime], 
    [Project1].[Case_ID] AS [Case_ID], 
    [Project1].[Case_Name] AS [Case_Name], 
    [Project1].[Client_ID] AS [Client_ID], 
    [Project1].[Matter_ID] AS [Matter_ID], 
    [Project1].[Is_Active] AS [Is_Active], 
    [Project1].[Requires_Case_Specific_Permissions] AS [Requires_Case_Specific_Permissions], 
    [Project1].[Last_Update] AS [Last_Update], 
    [Project1].[C3] AS [C3], 
    [Project1].[Category_ID] AS [Category_ID], 
    [Project1].[CategoryName] AS [CategoryName], 
    [Project1].[DefaultGridLayout] AS [DefaultGridLayout], 
    [Project1].[C4] AS [C4], 
    [Project1].[Repository_ID] AS [Repository_ID], 
    [Project1].[Description] AS [Description], 
    [Project1].[OfficeAbbr] AS [OfficeAbbr], 
    [Project1].[C5] AS [C5], 
    [Project1].[Repository_ID1] AS [Repository_ID1], 
    [Project1].[ConcordanceDBId] AS [ConcordanceDBId], 
    [Project1].[Repository_ID2] AS [Repository_ID2], 
    [Project1].[RepositoryType_Id] AS [RepositoryType_Id]
    FROM ( SELECT [Project1].[Id] AS [Id], [Project1].[PullStarted] AS [PullStarted], [Project1].[PullEnded] AS [PullEnded], [Project1].[MatchedQuery] AS [MatchedQuery], [Project1].[NewDocs] AS [NewDocs], [Project1].[UpdatedDocs] AS [UpdatedDocs], [Project1].[DeletedDocs] AS [DeletedDocs], [Project1].[Errors] AS [Errors], [Project1].[Id1] AS [Id1], [Project1].[Requestor] AS [Requestor], [Project1].[RequestTime] AS [RequestTime], [Project1].[Query] AS [Query], [Project1].[Enabled] AS [Enabled], [Project1].[LastPullTime] AS [LastPullTime], [Project1].[Case_ID] AS [Case_ID], [Project1].[Case_Name] AS [Case_Name], [Project1].[Client_ID] AS [Client_ID], [Project1].[Matter_ID] AS [Matter_ID], [Project1].[Is_Active] AS [Is_Active], [Project1].[Requires_Case_Specific_Permissions] AS [Requires_Case_Specific_Permissions], [Project1].[Last_Update] AS [Last_Update], [Project1].[Category_ID] AS [Category_ID], [Project1].[CategoryName] AS [CategoryName], [Project1].[DefaultGridLayout] AS [DefaultGridLayout], [Project1].[Repository_ID] AS [Repository_ID], [Project1].[Description] AS [Description], [Project1].[OfficeAbbr] AS [OfficeAbbr], [Project1].[Repository_ID1] AS [Repository_ID1], [Project1].[ConcordanceDBId] AS [ConcordanceDBId], [Project1].[Repository_ID2] AS [Repository_ID2], [Project1].[RepositoryType_Id] AS [RepositoryType_Id], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], [Project1].[C3] AS [C3], [Project1].[C4] AS [C4], [Project1].[C5] AS [C5], row_number() OVER (ORDER BY [Project1].[PullStarted] DESC) AS [row_number]
        FROM ( SELECT 
            [Extent1].[Id] AS [Id], 
            [Extent1].[PullStarted] AS [PullStarted], 
            [Extent1].[PullEnded] AS [PullEnded], 
            [Extent1].[MatchedQuery] AS [MatchedQuery], 
            [Extent1].[NewDocs] AS [NewDocs], 
            [Extent1].[UpdatedDocs] AS [UpdatedDocs], 
            [Extent1].[DeletedDocs] AS [DeletedDocs], 
            [Extent1].[Errors] AS [Errors], 
            [Extent2].[Id] AS [Id1], 
            [Extent2].[Requestor] AS [Requestor], 
            [Extent2].[RequestTime] AS [RequestTime], 
            [Extent2].[Query] AS [Query], 
            [Extent2].[Enabled] AS [Enabled], 
            [Extent2].[LastPullTime] AS [LastPullTime], 
            [Extent3].[Case_ID] AS [Case_ID], 
            [Extent3].[Case_Name] AS [Case_Name], 
            [Extent3].[Client_ID] AS [Client_ID], 
            [Extent3].[Matter_ID] AS [Matter_ID], 
            [Extent3].[Is_Active] AS [Is_Active], 
            [Extent3].[Requires_Case_Specific_Permissions] AS [Requires_Case_Specific_Permissions], 
            [Extent3].[Last_Update] AS [Last_Update], 
            [Extent4].[Category_ID] AS [Category_ID], 
            [Extent4].[CategoryName] AS [CategoryName], 
            [Extent5].[DefaultGridLayout] AS [DefaultGridLayout], 
            [Extent6].[Repository_ID] AS [Repository_ID], 
            [Extent6].[Description] AS [Description], 
            [Extent6].[OfficeAbbr] AS [OfficeAbbr], 
            [Extent9].[Repository_ID] AS [Repository_ID1], 
            [Extent9].[ConcordanceDBId] AS [ConcordanceDBId], 
            [Extent12].[Repository_ID] AS [Repository_ID2], 
            [Extent13].[RepositoryType_Id] AS [RepositoryType_Id], 
            1 AS [C1], 
            1 AS [C2], 
            1 AS [C3], 
            1 AS [C4], 
            1 AS [C5]
            FROM           [dbo].[DocPullRuns] AS [Extent1]
            LEFT OUTER JOIN [dbo].[DocumentPullDefinitions] AS [Extent2] ON [Extent1].[DocumentPullDefinitionId] = [Extent2].[Id]
            LEFT OUTER JOIN [dbo].[Cases] AS [Extent3] ON [Extent2].[CaseId] = [Extent3].[Case_ID]
            LEFT OUTER JOIN [dbo].[DocCategories] AS [Extent4] ON [Extent2].[CategoryId] = [Extent4].[Category_ID]
            LEFT OUTER JOIN [dbo].[DocCategories] AS [Extent5] ON [Extent2].[CategoryId] = [Extent5].[Category_ID]
            LEFT OUTER JOIN [dbo].[Repositories] AS [Extent6] ON [Extent2].[RepositoryId] = [Extent6].[Repository_ID]
            LEFT OUTER JOIN  (SELECT [Extent7].[Repository_ID] AS [Repository_ID3], [Extent7].[RepositoryType_Id] AS [RepositoryType_Id], [Extent7].[Description] AS [Description], [Extent7].[OfficeAbbr] AS [OfficeAbbr], [Extent8].[Repository_ID] AS [Repository_ID4], [Extent8].[ConcordanceDBId] AS [ConcordanceDBId]
                FROM  [dbo].[Repositories] AS [Extent7]
                LEFT OUTER JOIN [dbo].[ConcordanceRepositories] AS [Extent8] ON [Extent7].[Repository_ID] = [Extent8].[Repository_ID] ) AS [Join6] ON [Extent2].[RepositoryId] = [Join6].[Repository_ID3]
            LEFT OUTER JOIN [dbo].[ConcordanceRepositories] AS [Extent9] ON [Join6].[Repository_ID4] = [Extent9].[Repository_ID]
            LEFT OUTER JOIN  (SELECT [Extent10].[Repository_ID] AS [Repository_ID5], [Extent10].[RepositoryType_Id] AS [RepositoryType_Id], [Extent10].[Description] AS [Description], [Extent10].[OfficeAbbr] AS [OfficeAbbr], [Extent11].[Repository_ID] AS [Repository_ID6], [Extent11].[ConcordanceDBId] AS [ConcordanceDBId]
                FROM  [dbo].[Repositories] AS [Extent10]
                LEFT OUTER JOIN [dbo].[ConcordanceRepositories] AS [Extent11] ON [Extent10].[Repository_ID] = [Extent11].[Repository_ID] ) AS [Join9] ON [Extent2].[RepositoryId] = [Join9].[Repository_ID5]
            LEFT OUTER JOIN [dbo].[ConcordanceRepositories] AS [Extent12] ON [Join9].[Repository_ID6] = [Extent12].[Repository_ID]
            LEFT OUTER JOIN [dbo].[Repositories] AS [Extent13] ON [Extent2].[RepositoryId] = [Extent13].[Repository_ID]
        )  AS [Project1]
    )  AS [Project1]
    WHERE [Project1].[row_number] > 0
    ORDER BY [Project1].[PullStarted] DESC
    
    2 回复  |  直到 14 年前
        1
  •  7
  •   Craig Stuntz    15 年前

    take()不会改变查询;相反,它返回 新的 表达式,代码忽略它。因此,将代码更改为:

    if (maximumRows > 0)
        query = query.Take(maximumRows);
    
        2
  •  -1
  •   Garvin    14 年前

    如果只需要最大行数,就不需要if语句。如果它没有达到最大值,那么它只会返回它得到的任何东西。

    你可以说:

      return query.Take(maximumRows).ToList();