Подтвердить что ты не робот

Чудной. Paging

Я пытаюсь использовать ORP Dapper, и я запрашиваю таблицу Posts.

Но я хотел бы получить постраничные результаты...

1 - Как я могу это сделать? Разве нет помощника для этого?

2 - Может ли Dapper Query вернуть IQueryable?

Спасибо, Miguel

4b9b3361

Ответ 1

1) Dapper не имеет встроенной функции разбиения на страницы. Но его не слишком сложно реализовать непосредственно в запросе. Пример:

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY InsertDate) AS RowNum, *
          FROM      Posts
          WHERE     InsertDate >= '1900-01-01'
        ) AS result
WHERE   RowNum >= 1 // *your pagination parameters
    AND RowNum < 20  //*
ORDER BY RowNum

Требуется SQL Server 2005 +

2) Dapper возвращает IEnumerable<T>.

Ответ 2

Вы не указали базу данных или версию. Если вам посчастливилось использовать новый SQL Server 2012 и иметь доступ к MSDN, вы можете использовать блестящие новые ключевые слова OFFSET и FETCH. Следующий запрос пропустит 20 записей и вернет следующие 5.

SELECT * FROM [Posts]
ORDER BY [InsertDate]
OFFSET 20 ROWS
FETCH NEXT 5 ROWS ONLY

За дополнительной информацией обращайтесь http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx#Offset.

Кроме того, достаточно просто скопировать способ Massive и написать собственный метод расширения для IDbConnection. Здесь Массивный код.

var query = string.Format("SELECT {0} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {2}) AS Row, {0} FROM {3} {4}) AS Paged ", columns, pageSize, orderBy, TableName, where);

Ответ 3

Я создал образец проекта для демонстрации пользовательского подкачки Dapper, сортировки поддержки, критериев и фильтра:

https://github.com/jinweijie/Dapper.PagingSample

В принципе, метод выглядит следующим образом:

 Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
        , int pageIndex
        , int pageSize
        , string[] asc
        , string[] desc);

Первое возвращаемое значение - это список элементов. Второе возвращаемое значение - это общее количество.

Надеюсь, что это поможет.

Спасибо.

Ответ 4

Если у вас нет Sql Server 2012 или у вас есть другая СУБД, один из способов сделать подкачку - это разделить обработку между СУБД и веб-сервером или клиентом. --- это рекомендуется только для небольшого размера. Вы можете использовать ключевое слово TOP в Sql Server или LIMIT в MySql или ROWNUM в Oracle, чтобы получить максимальное количество строк в наборе данных. Количество строк, которые вы выбрали, равно числу, которое вы пропустили бы, плюс номер, который вы бы выбрали:

top = skip + take;

например, вы хотели бы пропустить 100 строк и выполнить следующие 50:

top = 100 + 50

Итак, ваш оператор SQL будет выглядеть так (вкус SQL-сервера)

SELECT    TOP 150 Name, Modified, content, Created
FROM      Posts
WHERE     Created >= '1900-01-01'

На клиенте: если вы используете язык .NET, такой как С#, и используя Dapper, вы можете использовать linq, чтобы пропустить несколько строк и взять несколько строк:

var posts = connection.Query<Post>(sqlStatement, dynamicParameters);
return posts?.ToList().Skip(skipValue).Take(takeValue);