Elegancko. Paging

Próbuję Dapper ORM i odpytuję tabelę postów.

Ale chciałbym dostać wyniki paged ...

1-Jak mogę to zrobić? Nie ma do tego pomocnika?

2-Czy Dapper Query zwróci IQueryable?

Dziękuję, Miguel

Author: Miguel Moura, 2012-03-24

4 answers

1) Dapper nie ma wbudowanej funkcji paginacji. Ale nie jest zbyt trudne, aby zaimplementować go bezpośrednio w zapytaniu. Przykład:

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

Wymaga SQL Server 2005+

2) Dapper zwraca IEnumerable<T>.

 31
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-29 06:30:26

Nie podałeś bazy danych ani wersji. Jeśli masz szczęście, aby móc korzystać z zupełnie nowego SQL Server 2012 i mieć dostęp do MSDN, możesz użyć błyszczących nowych słów kluczowych OFFSET i FETCH. Poniższe zapytanie pominie 20 rekordów i zwróci następne 5.

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

Zobacz http://msdn.microsoft.com/en-us/library/ms188385(v=sql. 110). aspx#Offset Więcej informacji.

Ponadto, łatwo jest skopiować sposób, w jaki robi to Massive i napisać własną metodę rozszerzenia dla IDbConnection. Oto Kod Massive ' a.

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);
 61
Author: Jarrett Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-28 23:07:25

Stworzyłem przykładowy projekt, aby zaprezentować eleganckie niestandardowe stronicowanie, wsparcie sortowania, kryteriów i filtra:

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

Zasadniczo metoda wygląda tak:

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

Pierwszą zwracaną wartością jest lista pozycji. Druga wartość zwracana jest liczbą całkowitą.

Mam nadzieję, że to pomoże. Dzięki.
 0
Author: JIN Weijie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 05:30:49

Jeśli nie masz Sql Server 2012 lub masz inne DBMS, jednym ze sposobów na stronicowanie jest podzielenie przetwarzania między DBMS a serwerem WWW lub klientem. --- jest to zalecane tylko dla małych rozmiarów zestawu. Możesz użyć słowa kluczowego " TOP " w SQL Server lub LIMIT w MySql lub ROWNUM w Oracle, aby uzyskać najwyższą liczbę wierszy w zestawie danych. Liczba wierszy, które chcesz pobrać, jest równa liczbie, którą chcesz pominąć oraz liczbie, którą chcesz pobrać:

top = skip + take;

Na przykład, ty chcesz pominąć 100 wierszy i wziąć następne 50:

top = 100 + 50

Więc twoje polecenie SQL wyglądałoby tak (SQL server)

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

Na kliencie: jeśli używasz języka. NET, takiego jak C# i używasz Dapper, możesz użyć linq, aby pominąć kilka wierszy i pobrać kilka wierszy w ten sposób:

var posts = connection.Query<Post>(sqlStatement, dynamicParameters);
return posts?.ToList().Skip(skipValue).Take(takeValue);
 -10
Author: ErnestoDeLucia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 14:39:49