2012-04-22 88 views
0

我有類別和子類別。每個子類別都有一些產品。 例如編程類別有| C#,java,基本子類| |其中c#有c#3,c#3.5產品| java有java ee,java我等等分頁在asp.net mvc

我想從linq到EF的類別中選擇10個產品。

問題是我不想加載數據庫中的所有產品,然後對它們進行排序,然後選擇其中的10個。

我想要一個解決方案,我只需從數據庫中取出10個產品,而無需將所有產品從數據庫傳回網絡服務器。

我知道EF很貪心,只會購買10種產品而略過一些。但在我的情況下,我有類別和子類別,所以我想我應該先選擇屬於某個類別的不同子類別的所有產品,然後將它們附加到列表中,以便將所有產品都帶到服務器,然後選擇其中的10個。

什麼是最佳實踐,以便我不必將所有產品傳輸到服務器?

+0

,你可以使用類似https://github.com/TroyGoode/PagedList做分頁等你BTW – Manatherin 2012-04-22 10:40:58

+0

我看到它有點複雜爲了我想要做的事。 – 1AmirJalali 2012-04-22 13:43:32

回答

2

您可以在一個查詢做到這一點:

var pagedProducts = _db.Categories.Join( 
    _db.Products, 
    c => c.CategoryId, 
    p => p.CategoryId, 
    (Category, Products) => 
     new 
     { 
      CategoryType = Category, 
      ItsProducts = Products 
     }) 
     .OrderBy(g => g.Category.Name) 
     .Skip((CurrentPage - 1) * pageSize) 
     .Take(pageSize); 
+0

排序呢?它不應該先排序然後分頁嗎?如何分類? – 1AmirJalali 2012-04-22 09:16:39

+0

@cSharpper,在'Take'和'Skip'之前你應該'OrderBy'來使分頁正確地得到頁面,或者至少保持默認的順序。 – 2012-04-22 09:30:56

+0

你的代碼是正確的,但我終於寫下了這段代碼:var categoryModel = storeDB.Categories.Single(c => c.CategoryId == categoryId); var subCategoriesModel = storeDB.SubCategories.Where(c => c.CategoryId == categoryModel.CategoryId); var subcategoriesID = subCategoriesModel.Select(s => s.SubCategoryId).ToList(); var products =(來自storeDB中的p.Products where subcategoriesID.Contains(p.SubCategoryId) select p).OrderBy(p => p.ProductId).Skip((page - 1)* pageSize).Take頁面大小); – 1AmirJalali 2012-04-22 14:21:44