LINQ Группировка по строке и подсчет дочернего свойства сгруппированного свойства

Я написал код, как показано ниже:

 Session["priceRange"] = ranges.Select(r => new PriceRangeGraph
                {
                    Price = Math.Round(r, 2),
                    Sales = lista.Where(x => ranges.FirstOrDefault(y => y >= x.SalePrice) == r).Sum(x => x.SaleNumber),
                    SuccessfulSellers = lista.GroupBy(x => x.StoreName).Where(x => ranges.FirstOrDefault(y => y >= x.Select(z => z.SalePrice).FirstOrDefault()) == r && x.Select(h => h.SaleNumber).FirstOrDefault() > 0).Count(),
                    UnSuccessfulSellers = lista.GroupBy(x => x.StoreName).Where(x => ranges.FirstOrDefault(y => y >= x.Select(z => z.SalePrice).FirstOrDefault()) == r && x.Select(h => h.SaleNumber).FirstOrDefault() == 0).Count(),
                }).ToList();

Это две проблемные строки кода:

SuccessfulSellers = lista.GroupBy(x => x.StoreName).Where(x => ranges.FirstOrDefault(y => y >= x.Select(z => z.SalePrice).FirstOrDefault()) == r && x.Select(h => h.SaleNumber).FirstOrDefault() > 0).Count(),
UnSuccessfulSellers = lista.GroupBy(x => x.StoreName).Where(x => ranges.FirstOrDefault(y => y >= x.Select(z => z.SalePrice).FirstOrDefault()) == r && x.Select(h => h.SaleNumber).FirstOrDefault() == 0).Count(),

Как вы видите, в торговой недвижимости я нахожу диапазон цен, в котором был продан товар, а затем просто суммирую все продажи в данном диапазоне.

Теперь я пытаюсь увидеть, сколько успешных / неудачных пользователей (с их именами) совершали продажи в этих заданных диапазонах.

So for example user test123 made 5 sales, test1234 made 4 sales, test56 made 0 sales in range 0-20$

Выход для этого диапазона будет:

SuccessfulSellers=2
UnSuccessfulSellers = 1

Код выше, который я пробовал, не дает мне правильных результатов вообще...

Как вы видите, я группирую по имени пользователя, чтобы получить номер события, а затем отфильтрую диапазон, для которого пользователь совершил продажу, а затем просто добавлю еще один оператор и, чтобы отфильтровать тех, у кого продажи =0, и тех, у кого больше чем 0 продаж...

Что я здесь не так делаю?

1 ответ

Я думаю, что ваша проблема является одним из порядка операций. Как только вы группируете, вы на самом деле имеете дело с гораздо более сложной структурой данных: список списков, в основном. Сохраните свою группу до тех пор, пока не пройдете фильтр (-ы), и ваша жизнь станет намного проще.

Например:

allSales.Where(m => m.Price >= 0 && m.Price <= 20)
     .GroupBy(m => m.User)
     .Select(m => new { User = m.Key, Sales = m.Count() });
Другие вопросы по тегам