использование CTE в Entity Framework для подкачки - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь использовать CTE в SQL Server 2008 и использовать его в Entity Framework.

Ниже приводится 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, используя Entity Framework и Stored Процедура .Благодарю.

Ответы [ 3 ]

1 голос
/ 01 августа 2011

Наконец-то я все заработал.УСТАНАВЛИВАЙТЕ в базе данных следующее, а затем используйте CTE или аналогичные вещи:

SET FMTONLY OFF

К вашему сведению: у меня не было времени, чтобы больше узнать об этом утверждении, но я попробовал его, и оно работает.

1 голос
/ 06 июля 2011

Вы не можете использовать LINQ для запроса сущностей? Если вы можете использовать операции Пропустить и Взять, может быть проще исправить.

0 голосов
/ 12 июля 2011

Я полагаю, что проблема в том, что вы используете встроенную временную таблицу - и, что еще важнее, создаете ее с помощью 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 видеть выводстолбцы.

...