Я пытаюсь использовать ORP Dapper, и я запрашиваю таблицу Posts.
Но я хотел бы получить постраничные результаты...
1 - Как я могу это сделать? Разве нет помощника для этого?
2 - Может ли Dapper Query вернуть IQueryable?
Спасибо, Miguel
Я пытаюсь использовать ORP Dapper, и я запрашиваю таблицу Posts.
Но я хотел бы получить постраничные результаты...
1 - Как я могу это сделать? Разве нет помощника для этого?
2 - Может ли Dapper Query вернуть IQueryable?
Спасибо, Miguel
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>
.
Вы не указали базу данных или версию. Если вам посчастливилось использовать новый 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);
Я создал образец проекта для демонстрации пользовательского подкачки Dapper, сортировки поддержки, критериев и фильтра:
https://github.com/jinweijie/Dapper.PagingSample
В принципе, метод выглядит следующим образом:
Tuple<IEnumerable<Log>, int> Find(LogSearchCriteria criteria
, int pageIndex
, int pageSize
, string[] asc
, string[] desc);
Первое возвращаемое значение - это список элементов. Второе возвращаемое значение - это общее количество.
Надеюсь, что это поможет.
Спасибо.
Если у вас нет 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);