2013-11-04 43 views
6

PagedList是一個尋呼庫。帶實體框架的PagedList獲取所有記錄

_dbContext.Products.ToList().ToPagedList(1, 25); 

上面的代碼將獲得前25的記錄在數據庫中的第1頁。

的問題是,ToList()通話將獲得數據庫中的所有記錄。然後ToPageList()調用將選擇前25條記錄。

如何將EF與PagedList結合起來,這樣我只能得到數據庫中的前25條記錄?並沒有得到所有記錄,然後拿到前25條記錄。

PS:我應該編寫自己的Paging庫還是使用在線庫?請給我建議任何其他圖書館。

回答

6

事實上,你正在做一個ToList(),所以查詢將被執行,並且延期執行不會被延期。

您可以嘗試不使用ToList()調用,但這一切都取決於執行方法ToPagedList(int, int)

你可以自己做分頁。

const int pageSize = 25; 
const int pageNumber = 1; 

IQueryable<Product> query = _dbContext.Products; 
var pagedQuery = query.Skip(pageSize * (pageNumber - 1)).Take(pageSize).ToList(); 

是的,你可以躲在後面上IQueryable<T>擴展方法這個邏輯。

public static class IQueryableExtensions { 
    public static IQueryable<T> ToPagedQuery<T>(this IQueryable<T> query, int pageSize, int pageNumber) { 
     return query.Skip(pageSize * (pageNumber - 1)).Take(pageSize); 
    } 
} 
+1

+1,但它只是錯過了''方法名稱後:'ToPagedQuery (..)' – Askolein

+0

@Askolein固定,感謝名單! – Maarten

+0

@Maarten。你如何使這個工作異步的任何想法? – Thierry

4

最簡單的解決方案是使用AsEnumerable(),但它需要排序。與ToList()不同,AsEnumerable()未命中數據庫。

_dbContext.Products.OrderBy(p => p.Id).AsEnumerable().ToPagedList(1, 25); 
+0

這是一個很好的解決方案,謝謝! –

+1

你甚至不需要這個'AsEnumerable()'。您可以直接使用'_dbContext.Products.OrderBy(p => p.Id).ToPagedList(1,25);'。 – Alisson