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() });