Чудной. Paging - PullRequest
       9

Чудной. Paging

47 голосов
/ 24 марта 2012

Я пытаюсь использовать Dapper ORM и запрашиваю таблицу сообщений.

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

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

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

Спасибо, Miguel

Ответы [ 5 ]

72 голосов
/ 29 марта 2012

Вы не указали базу данных или версию. Если вам повезло, что вы можете использовать совершенно новый 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);
35 голосов
/ 24 марта 2012

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 голосов
/ 13 февраля 2019

Вот полная рабочая версия с использованием C # и Dapper.

/// <summary>
    /// Gets All People
    /// </summary>
    /// <returns>List of People</returns>
    public IEnumerable<Person> GetAllPeople(Pager pager)
    {
        var sql = (@" select * from [dbo].[Person]
                      order by [PeplNo]
                      OFFSET      @Offset ROWS 
                      FETCH NEXT  @Next   ROWS ONLY");

        using (IDbConnection cn = Connection)
        {
            cn.Open();

            var results = cn.Query<Person>(sql,pager);

            return results;
        }
    }


public class Pager
{
    public int Page { get; set; }
    public int PageSize { get; set; }

    public int Offset { get; set; }
    public int Next { get; set; }

    public Pager(int page, int pageSize = 10)
    {
        Page = page < 1 ? 1 : page;
        PageSize = pageSize < 1 ? 10 : pageSize;

        Next = pageSize;
        Offset = (Page - 1) * Next;
    }

}
1 голос
/ 05 июля 2017

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

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

В принципе, метод выглядит так:

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

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

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

Спасибо.

0 голосов
/ 09 декабря 2016

Если у вас нет 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, такой как C #, и используете Dapper, выможно использовать linq, чтобы пропустить несколько строк и взять несколько строк, например:

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