2012-04-22 2 views
0

У меня есть категории и подкатегории. Каждая подкатегория имеет некоторые продукты. например, категория программирования | C#, java, базовые подкатегории | где C# имеет C# 3, C# 3.5 продукты | java имеет java ee, java me и т. д.pagination in asp.net mvc

Я хочу выбрать 10 продуктов из категорий, используя linq для EF.

Проблема в том, что я не хочу загружать все продукты из базы данных, а затем сортировать их, а затем выбирать 10 из них.

Я хочу решение, которое я могу взять всего 10 продуктов из базы данных, не передавая все продукты из базы данных обратно на веб-сервер.

Я знаю, что EF жадный и займет всего 10 продуктов и пропустит некоторые из них. но в моем случае, у которого есть категории и подкатегории, поэтому я должен сначала выбрать все продукты из разных подкатегорий, принадлежащих категории, и добавить их в список, который приведет к тому, что все продукты будут отправлены на сервер, а затем выберите 10 из них.

Какова наилучшая практика, так что мне не нужно передавать все продукты на сервер?

+0

вы могли бы использовать что-то вроде https://github.com/TroyGoode/PagedList делать подкачки и т.д. для вас кстати – Manatherin

+0

я увидел, что его немного сложнее для чего я хочу. – 1AmirJalali

ответ

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

+0

@cSharpper, вы должны 'OrderBy' перед' Take' и 'Skip', чтобы сделать разбивку на страницы правильной или, по крайней мере, сохранить порядок по умолчанию. –

+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 = (от p в магазинеDB.Products где подкатегорииID.Contains (p.SubCategoryId) выберите p) .OrderBy (p => p.ProductId) .Skip ((страница - 1) * pageSize) .Take (размер страницы); – 1AmirJalali