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

마지막으로, 나는 그것을 얻었습니다. 참고로

SET FMTONLY OFF 

: 다음 데이터베이스에서 다음과 CTE 또는 유사한 것을 사용하는 것보다 SET 나는이 문장에 대한 자세한 내용을 조사 할 시간을 얻을하지 않았다,하지만 난 그것을 시도하고 작동합니다.

+0

데이터베이스마다 한 번만 설정해야합니다. – iMatoria

1

엔티티를 쿼리하는 데 LINQ를 사용할 수 없습니까? 건너 뛰기 및 가져 오기 작업을 사용하는 것이 더 쉬운 방법 일 수 있습니다.

+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 

... 그러면 임시 테이블 (또는 두 번째 쿼리)이 필요하지 않으므로 Entity Framework에서 출력 열을 볼 수 있습니다.

+0

여기서 2 개의 결과 집합을 1로 병합했습니다. 이렇게하면 쿼리를 읽기 쉽고 유지하기가 어려워집니다. 많은 시간을 나는 3-4 resultsets 매우 다양한 필요합니다. 하지만, 좋은 점은 내가 여기에 발견 SELECT * INTO 일 대신 명시적인 임시 테이블로 시도해야한다는 것입니다. – iMatoria

관련 문제