2

SQL Server 2008でCTEを使用しようとしましたが、Entityフレームワークでそれを使用しています。エンティティフレームワークで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を実装する方法をガイドしてください。おかげさまで

+0

なぜカウント(*)の代わりにisnull(sum(1,0))を実行しましたか? – Kyle

+0

@カイル:私は正確に覚えていませんが、このようなものです:SELECT文が何の行も返さないとき、 "TotalRecord"も0に設定されます。 – iMatoria

答えて

1

最後に、私はそれを働かせました。データベースでかつCTEまたは類似のものを使用するよりも、次のように設定します。

SET FMTONLY OFF 

FYI:私はこの文の詳細を調査する時間を取得できませんでしたが、私はそれを試してみました、それが動作します。

+0

データベースごとに1回だけ設定する必要があります。 – iMatoria

1

LINQを使用してエンティティを照会することはできませんか? Skip and Take操作を使用することができれば、より簡単に解決できる場合があります。

+0

私はストアドプロシージャを使用するように求められました。 – iMatoria

0

SELECT * INTOを使用してインラインテンポラリテーブルを使用していることが問題であると考えています。そのため、Entity Frameworkはストアドプロシージャの出力列を把握することができません。

このような場合はどうなりますか?

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 

...テンポラリテーブル(または2番目のクエリ)は必要ありません。エンティティフレームワークが出力列を参照できるようにする必要があります。

+0

ここでは、2つの結果セットを1にマージしました。これにより、クエリの読み込みと保守が非常に難しくなります。多くの場合、私は3-4の結果を必要とし、非常に多様です。しかし、私がここで見つけた良い点は、SELECT * INTOの代わりに明示的なテンポラリテーブルを試してみることです。 – iMatoria