EF Core 5 i paginacja serwerowa

0

Cześć,
w jaki sposób obsługujecie paginowanie stron w c# i .net 5? Chodzi mi o pobieranie paginowanych danych za pomocą EF. Są do tego może jakieś biblioteki?
Jak dla mnie jest to taka podstawowa funkcja, a nie mogę się doszukać jak to zrobić poprawnie. Oczywiście nie chodzi mi o to że pobiorę całą zawartość tabelki, a front-end w gridzie sobie to podzieli na strony po danej ilości wierszy per strona, ale chodzi mi o to żeby z DB pobrać tylko taką ilość danych jaka ma zostać ostatecznie wyświetlona użytkownikowi.
Do tego dochodzi jeszcze problem filtrowania danych.
Co chcę osiągnąć:
W aplikacji webowej mam grid z danymi np. lista produktów domyślnie user ma wybrane 50 wierszy na stronę i ustawione sortowanie np. po kolumnie z nazwą produktu, api ma zwrócić pierwsze 50 produktów zgodnie z sortowaniem, zapewne musiało by też zwrócić ilość elementów pasujących do danego zapytania aby można było wyświetlić ilość dostępnych stron. Zmieniając strony 2,3...20 też powinno pobrać dana ilość wierszy zgodnie z stroną.
Identycznie powinno się to zachować jeśli teraz user będzie chciał po nazwie odfiltrować np. "kubek".

1

Skip i Take generują odpowiedni SQL + prosty wzór na obliczenie ile pominąć = paging.

1

Jak dla mnie jest to taka podstawowa funkcja, a nie mogę się doszukać jak to zrobić poprawnie.

serio? :P

https://www.google.com/search?client=firefox-b-d&q=ef+core+pagination

nawet gotowce są do podglądnięcia +- o co chodzi

public abstract class PagedResultBase
{
    public int CurrentPage { get; set; } 
    public int PageCount { get; set; } 
    public int PageSize { get; set; } 
    public int RowCount { get; set; }
 
    public int FirstRowOnPage
    { 
        get { return (CurrentPage - 1) * PageSize + 1; }
    }
 
    public int LastRowOnPage
    {
        get { return Math.Min(CurrentPage * PageSize, RowCount); }
    }
}
 
public class PagedResult<T> : PagedResultBase where T : class
{
    public IList<T> Results { get; set; }
 
    public PagedResult()
    {
        Results = new List<T>();
    }
}
public static PagedResult<T> GetPaged<T>(this IQueryable<T> query, int page, int pageSize) where T : class
{
     var result = new PagedResult<T>();
     result.CurrentPage = page;
     result.PageSize = pageSize;
     result.RowCount = query.Count();


     var pageCount = (double)result.RowCount / pageSize;
     result.PageCount = (int)Math.Ceiling(pageCount);
 
     var skip = (page - 1) * pageSize;     
     result.Results = query.Skip(skip).Take(pageSize).ToList();
 
     return result;
}
1

OData

0

@blane:

A jak ogarnąć filtrowanie po jakiejś kolumnie albo sortowanie? jako query ma zostać przekazany DataSet i Where itp ?

Generalnie query możesz rozbić na wiele "części" i składać ja, a dopiero później zmaterializować.

e.g


IQueryable<User> query = bazka.Users;

if (blabla)
  query = query.Where(xd => xd.XD == true)

if (blabla2)
  query = query.Where(x => x.Abc > 152)

if (yada_yada)
  query = query.Select(x => x.Dx)

return query.Zpaginuj(asdasd); // pod spodem woła ToList();   
0

A co z taką paginacją można zrobić, jak grid końcowy po stronie frontendowej jest składany z kilku tabel po stronie DB? jak wtedy obsłużyć sortowanie filtrowanie? Lub np. w tabeli A mamy FK do innej tabeli to w gridzie nie chcemy pokazać tego ID FK, tylko ToString danego obiektu.

0
blane napisał(a):

A co z taką paginacją można zrobić, jak grid końcowy po stronie frontendowej jest składany z kilku tabel po stronie DB? jak wtedy obsłużyć sortowanie filtrowanie?

Zawsze możesz sklejać dane na backendzie i wtedy też możesz sobie ogarnąć paginację.

blane napisał(a):

Lub np. w tabeli A mamy FK do innej tabeli to w gridzie nie chcemy pokazać tego ID FK, tylko ToString danego obiektu.

Jak nie chcesz widzieć jakichś danych, to po prostu nie zwracasz ich w view modelu czy tam innym dto.

1 użytkowników online, w tym zalogowanych: 0, gości: 1