Обработка пейджинга и «отложенная загрузка» с помощью DataSets? - PullRequest
2 голосов
/ 07 апреля 2011

Моя компания использует необработанные нетипизированные наборы данных, заполненные исключительно с помощью хранимых процедур.Мне было поручено найти способ извлечения очень больших наборов результатов (подкачки страниц) и способы получить функциональность Lazy Loading (по крайней мере, я думаю, что это ленивая загрузка; я все еще изучаю эту штуку, если честно), поэтому мы неизвлечение десятков тысяч строк в одном пакете и перегрузка ресурсов сервера.

Лично я не очень хорошо знаком с DataSets, так как я избегаю их, когда это возможно, и я бы предпочел полностью избавиться от них здесь, но высказывание «Измени все для использования LINQ / EF» не будетправильный ответ, поскольку для руководства нет никакой бизнес-ценности (и переделка займет слишком много времени, поэтому идея будет сразу же отвергнута).

Есть ли ресурсы, на которые я мог бы обратить внимание, чтобы получить такой же видфункциональность, но с использованием стандартных нетипизированных наборов данных?

РЕДАКТИРОВАТЬ: Кроме того, мне нужно решение, которое может работать с динамически созданным SQL, который не использует хранимую процедуру.

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

Вам нужно будет реализовать подкачку внутри хранимых процедур.Я предполагаю, что вы используете Sql Server, поэтому вот ссылка:

http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx

Обратите внимание, что это не имеет ничего общего с DataSets per se .Предположительно, ваш код генерирует DataSet из вызова хранимой процедуры.Если вы переписываете свои проки для выполнения подкачки, ваш код сгенерирует DataSet, который содержит только записи запрошенной страницы.

Вы можете использовать DataSet, возвращенный вашим исходным проком, для реализации подкачки, кэшируя DataSet и возвращаятолько выбранные строки для клиента (или, точнее, используя только выбранные строки из DataSet для генерации клиентского HTML), но это суперская, очень плохая идея.

2 голосов
/ 07 апреля 2011

Все, что вам нужно сделать, это изменить хранимую процедуру, чтобы отобразить список результатов. Это, конечно, также будет означать, что вам придется передавать в качестве параметров определенные критерии, такие как номер страницы и т. Д. Предполагая, что вы используете SQL Server 05 или новее, обратите внимание на следующее:

http://www.codeproject.com/KB/database/PagingResults.aspx

1 голос
/ 07 апреля 2011

У меня была такая же проблема с сайтом asp.net 2.0, для этого нет решения "отложенной загрузки". Чтобы разбить на страницы наборы данных, я использую 2 sprocs, которые помогут мне обернуть функциональность подкачки при каждом выборе, который я делаю.

CREATE PROCEDURE [dbo].[Generic_Counting]
    @tables VARCHAR(MAX),
    @filter VARCHAR(MAX) = '1=1'    
AS
BEGIN
    SET NOCOUNT ON;


    DECLARE @strQuery VARCHAR(8000)

    SET @strQuery = ' SELECT COUNT(*) FROM '+ @tables +'
             WHERE '+ @filter 

    execute     (@strQuery)
    IF @@ERROR<>0 
    BEGIN 
        --error on generic count
        SET NOCOUNT OFF
        RETURN 10067
    END

    SET NOCOUNT OFF
    RETURN 0
END
GO

CREATE PROCEDURE [dbo].[Generic_Paging]
    @tables VARCHAR(1000),
    @pk VARCHAR(100), 
    @pageNumber INT = 1,
    @pageSize INT = 10, 
    @fields VARCHAR(MAX) = '*',
    @filter VARCHAR(MAX) = '1=1',
    @orderBy VARCHAR(MAX) = NULL
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @strQuery VARCHAR(8000) 
    DECLARE @strMinRecord VARCHAR(12);
    DECLARE @strMaxRecord VARCHAR(12);

    SET @strMinRecord = CONVERT(VARCHAR(12),((@pageNumber -1)*@pageSize + 1))  
    SET @strMaxRecord = CONVERT(VARCHAR(12), (@pageNumber * @pageSize)) 

        -- Use ROW_NUMBER function

    SET @strQuery ='
    WITH Generic_CTE As
    (
        SELECT ''RowNumber'' = ROW_NUMBER() OVER(ORDER BY ' +
        ISNULL(@orderBy,@pk) +'),' + 
        @fields + 
        ' FROM ' + @tables +
        ' WHERE ('+ @filter +')
    )
    SELECT ' + @fields + '
    FROM Generic_CTE
    WHERE RowNumber BETWEEN ' + @strMinRecord +' AND '+ @strMaxRecord 



    --print @strQuery
    execute (@strQuery)

    IF @@ERROR<>0 
    BEGIN 
        --error on generic paging
        SET NOCOUNT OFF
        RETURN 10066
    END
    SET NOCOUNT OFF 
    RETURN 0
END
GO
0 голосов
/ 07 апреля 2011

Вы можете взглянуть на шаблон Обработчик списка значений , разработанный для использования там, где «клиенту требуется список элементов ... для представления. Число элементов в списке неизвестно и во многих случаях может быть довольно большим. "

Примеры (в ссылке выше и здесь ) предназначены для Java, но должен перевести на asp.net довольно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...