在Entity框架中使用CTE进行分页

时间:2011-07-06 08:39:29

标签: visual-studio-2010 sql-server-2008 entity-framework-4 pagination common-table-expression

我正在尝试在sql server 2008中使用CTE并在实体框架中使用它。

以下是SP:

CREATE PROCEDURE GetReportingCategories
    -- Add the parameters for the stored procedure here
    @StartRow INT,
    @EndRow INT,
    @SortDirection VARCHAR(50),
    @SortExpression VARCHAR(50),
    @TotalRecord int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    ;WITH CTE (CategoryTitle, CreatedDate, UpdatedDate, [Status], RowNumber) AS 
    ( 
        SELECT CategoryTitle, 
            CreatedDate, 
            UpdatedDate, 
            [Status],
            ROW_NUMBER() OVER(ORDER BY
                case when @SortExpression='CategoryTitle' and @SortDirection='DESCENDING' then CategoryTitle end DESC,
                case when @SortExpression='CategoryTitle' and @SortDirection='ASCENDING' then CategoryTitle end ASC) AS RowNumber
        FROM ReportingCategory
    )

    SELECT * INTO #TtCTE FROM CTE;
    SELECT @TotalRecord = ISNULL(SUM(1), 0) FROM #TtCTE;

    SELECT * 
    FROM #TtCTE 
    WHERE RowNumber >= @StartRow AND RowNumber <= @EndRow;
END
GO

SP完美执行。但是,问题是在VS2010中从数据库更新模型后,当我尝试“添加函数导入”时,比我没有得到列信息。所以,无法消耗它。

请使用实体框架和存储过程指导如何使用CTE实现自定义页面。 谢谢。

3 个答案:

答案 0 :(得分:1)

您是否无法使用LINQ查询实体?如果你可以使用Skip and Take操作可能更容易解决。

答案 1 :(得分:1)

最后,我得到了它的工作。在数据库中设置以下内容,而不是使用CTE或类似的东西:

SET FMTONLY OFF

仅供参考:我没有时间对此声明进行更多调查,但我已经尝试过并且有效。

答案 2 :(得分:0)

我认为问题在于你正在使用内联临时表 - 甚至更多,使用SELECT * INTO创建它 - 因此实体框架无法弄清楚存储过程的输出列是什么将是。

这样的事情怎么样?

CREATE PROCEDURE GetReportingCategories
    -- Add the parameters for the stored procedure here    
    @StartRow INT,
    @EndRow INT,
    @SortDirection VARCHAR(50),
    @SortExpression VARCHAR(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    ;WITH CTE (CategoryTitle, CreatedDate, UpdatedDate, [Status], RowNumber) AS
    (
        SELECT CategoryTitle,             
            CreatedDate,
            UpdatedDate,
            [Status],
            ROW_NUMBER() OVER(ORDER BY
                case when @SortExpression='CategoryTitle' and @SortDirection='DESCENDING' then CategoryTitle end DESC,
                case when @SortExpression='CategoryTitle' and @SortDirection='ASCENDING' then CategoryTitle end ASC) AS RowNumber
        FROM ReportingCategory    
    )
    SELECT 
        (SELECT COUNT(*) FROM CTE) AS TotalRecords,
        CategoryTitle,             
        CreatedDate,
        UpdatedDate,
        [Status]
    FROM CTE
    WHERE RowNumber >= @StartRow AND RowNumber <= @EndRow
END

...那么你不需要临时表(或第二个查询),这应该允许Entity Framework查看输出列。