Как я могу получить бестселлера по группе продуктов с помощью LINQ - PullRequest
1 голос
/ 24 июня 2019

Мне нужно получить имя, тип продукта и сумму продавца с самыми высокими продажами в каждом типе продукта, используя linq, и вернуть список к просмотру.

{  
    public ActionResult Query2()
    {
        // this part gets me everything into one model type 
        List<QueryViewModel> result = db.SaleProducts
            .GroupBy(prod => prod.Type)
            .SelectMany(sale => sale.Select(
                row => new QueryViewModel
                {
                    Seller = row.Sale.User.Name,
                    ProductType = row.Type,
                    Sales = (double)sale.Where(x => x.Sale.UserId == row.Sale.UserId && x.Type.Equals(row.Type)).Sum(price => price.Price)
                }
            )).Distinct().ToList<QueryViewModel>();

        // this gives me the best per product type but i cant get the seller name 
        List<QueryViewModel> filter = (from res in result
                                       group res by res.ProductType into prodGroup
                                       select new QueryViewModel
                                       {
                                           ProductType = prodGroup.Key,
                                           Sales = prodGroup.Max(x => x.Sales)
                                       }).ToList<QueryViewModel>();

        // this is really just to get the seller name at this point 
        List<QueryViewModel> something = (from res in result
                                          join f in filter on res.Sales equals f.Sales
                                          select new QueryViewModel
                                          {
                                              Seller = res.Seller,
                                              ProductType = res.ProductType,
                                              Sales = res.Sales
                                          }).ToList<QueryViewModel>();

        return View(something);
    }
}

Должен вернуть списокQueryViewModel (имя, тип продукта, общий объем продаж).

Это возвращает это, но это кажется ужасно грязным, и я недостаточно разбираюсь в LINQ, чтобы разобраться в этом.

Есть ли лучшеболее чистый способ достижения желаемого результата?

1 Ответ

0 голосов
/ 25 июня 2019

Первая группа должна быть по типу и продавцу.

Что-то вроде этого должно помочь вам:

Quote_Masters.GroupBy(qm => new { qm.OrderTypeId, qm.SalesRepEmployeeId })
    .Select(x => new { Name = x.Key.SalesRepEmployeeId, x.Key.OrderTypeId, Total = x.Sum(qm => qm.Total_Price) })
    .OrderByDescending(x => x.Total).GroupBy(x => x.OrderTypeId).Select(x => x.FirstOrDefault())

Просто измените ваши соответствующие таблицы и поля.


Редактировать: ваш выбор в QueryViewModel будет новым {Name = x.Key.SalesRepEmployeeId, x.Key.OrderTypeId, Total = x.Sum (qm => qm.Total_Price)}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...