2013-01-12 14 views
5

Metoda rozszerzenia, którą KendoUI dodaje (ToDataSourceResult), wydaje się nie działać na Stronach> Strona # 1. Działa to dobrze przy pierwszym ładowaniu strony, ale kiedy próbuję użyć go z wirtualnym przewijaniem, aby pobrać strony, 2,3,4 ... N asynchronicznie, metoda ignoruje wszystkie dane w obiekcie IEnumerable, którego próbuję przekształcać.Rozszerzenie ToDataSourceResult nie wypełnia obiekt DataSourceResult

Mój kod wygląda następująco:

Mam kontroler MVC, które pobiera dane tak:

Database database = Database.GenerateDatabase(); 
ResultSet queryResults = database.GetEvents( 
    FilterHelper.GenerateQueryCriteria((List<IFilterDescriptor>) request.Filters, request.Page, request.PageSize) 
); 

Database.GetEvents zwraca obiekt tak:

public class ResultSet { 

    public List<ResultSetRow> Set; 
    public int PageRowCount; 
    public int TotalRecordCount; 
} 

Każdy ResultSetRow , jest instancją klasy, która ma 1 łańcuch znaków i 2 znaki jako właściwości.

W tym miejscu ustawiam punkt przerwania i sprawdzam zawartość ResultSet.Set. Baza danych poprawnie wypełnia listę tak dużą liczbą rekordów, jak podano w request.pageSize. Potwierdziłem, że zwracane są wyniki dla wszystkich numerów stron.

Następny etap, wszystko idzie źle:

DataSourceResult result = ((IEnumerable<ResultSetRow>) queryResults.Set).ToDataSourceResult(request); 

I sprawdzać zawartość obiektu DataSourceResult, a jego właściwość array „dane” jest pusta.

Dlaczego mój model (ResultSetRow) nie konwertuje obiektu DataSourceResult Kendo?

Niektóre dodatkowe info:

  • Kruszywa grupy, sortuje i filtry nie są używane.
  • Liczba wyników zwróconych przez Database.GetEvents odpowiada rozmiarowi żądanej strony.

Dzięki za pomoc SO społeczności

Odpowiedz

11

Głównym powodem korzystania ToDataSourceResult() jest to, że działa filtrowanie/zamówienie/grupowanie/wywołania wewnętrznego na serwerze bazy danych. W związku z tym działa najlepiej, gdy dany model nie został jeszcze wykonany.

To działa na IEnumerable, ale musisz załadować cały stół do pamięci, która nie jest skalowalna.

Ponieważ otrzymujesz tylko jedną stronę o wartości danych, po wywołaniu ToDataSourceResult uważa się, że to wszystkie dane w bazie danych, i dlatego zwraca pustą listę dla stron innych niż pierwsza.

+0

Tak więc, jeśli miałbym zignorować użycie DataSourceResult, czy mógłbym tylko bezpośrednio przesłać mój obiekt List ? –

+1

@JT mógłbyś ... ale Kendo już wygeneruje dla ciebie poprawną kwerendę do bazy danych, więc wymyślisz na nowo koło. Wersja Kendo będzie działać po włączeniu filtrowania/zamawiania/... –

+5

Ok, w oparciu o twoją opinię Rozwinąłem pracę: int pagenum = request.PageNum; request.PageNum = 1; DataSourceResult = ...; request.PageNum = pagenum; –

Powiązane problemy