2013-01-12 47 views
5

KendoUI添加的擴展方法(ToDataSourceResult)似乎在Pages> Page#1上失敗。它在第一次加載頁面時工作正常,但是當我嘗試使用虛擬滾動,以異步方式獲取頁面2,3,4 ... N時,該方法忽略IEnumerable對象中的所有數據轉化。ToDataSourceResult擴展未填充DataSourceResult對象

我的代碼如下:

我有一個MVC控制器,其取像這樣的數據:

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

Database.GetEvents返回類似的對象,以便:

public class ResultSet { 

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

每個ResultSetRow ,是一個具有1個字符串和2個int作爲屬性的類的實例。

此時,我設置了一個斷點並檢查ResultSet.Set的內容。數據庫使用request.PageSize指定的記錄正確填充List。我已確認所有頁碼都會返回結果。

下一階段,一切都嚴重:

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

我檢查DataSourceResult對象的內容,其數組屬性「數據」是空的。

爲什麼我的模型(ResultSetRow)未能轉換爲Kendo的DataSourceResult對象?

一些額外的信息:

  • 聚集,不被使用的組,排序和過濾器。
  • Database.GetEvents返回的結果數量與請求的頁面大小相匹配。

感謝您的幫助,所以社區

回答

11

的主要原因是使用ToDataSourceResult()是它運行過濾數據庫服務器上/排序/分組/分頁。因此,當給定尚未執行的IQueryable時,它效果最佳。

它可以在IEnumerable上工作,但是必須將整個表加載到內存中,這是不可擴展的。

由於您只獲取一頁的數據,因此調用ToDataSourceResult時,它認爲數據庫中的所有數據都是空的,並且返回第一個頁面以外的空列表。

+0

那麼,如果我忽略使用DataSourceResult,我可以直接json我的List 對象嗎? –

+1

@JT你可以......但Kendo已經爲你生成正確的數據庫查詢,所以你會重新發明輪子。 Kendo版本將在您打開過濾/訂購/ ... –

+5

好吧,根據您的反饋我開發了一個工作: int pagenum = request.PageNum; request.PageNum = 1; DataSourceResult = ...; request.PageNum = pagenum; –