Problem Linq, GroupBy

0

Cześć.
Chciałbym prosić o pomoc w sprawie nad którą siedzę już dobre kilka godzin, mianowicie:

Mam dwie klasy modelu:

public class Product 
{
    public int Id;
    public string Name;
    public decimal Price
    .....
}

i

public class Order
{
    public int Id;
    public int ProductID
    public string Name;
    public decimal Amount
    .....
}

i teraz, przy pomocy zapytania linkq chciałbym uzyskać dane abym mógł wyświetlić je w tabeli w takiej postaci:
Nazwa produktu | Cena | liczba sprzedanych sztuk | Suma
Produkt1 | 10 | 3 | 30
Produkt2 | 50 | 4 | 200
Produkt3 | 60 | 3 | 180

Suma: 410

dodam też, że cenę i ilość poszczególnego produktu można uzyskać z zamówienia, ponieważ w jednym zamówieniu może być tylko jeden sprzedany produkt.
Bardzo proszę o pomoc.
Pozdrawiam.

0

Popraw najpierw model (jedno zamówienie może mieć tylko jeden produkt? trochę słabo). Potem pomyślimy nad grupowaniem.

0

Niestety taki jest wymóg odnośnie tego aby był tylko jeden produkt w jednym zamówieniu - wiem, że to słabe ale narzucone z góry ;)

0

Tak na szybko pisałem z pamięci więc mógł się wkraść błąd

Orders.GroupBy(d => d.ProductID)
    .Select(
        g => new  OrderViewModel
        {                     
           Name = g.First().Product.Name,
           Total = g.Count(),
           Price = g.First().Product.Price,
        });
public class OrderViewModel
 {
        public string Name {get;set;}
        public string  Total {get;set;}
        public  decimal Price {get;set;}
        public decimal TotalPrice => Total*Price;
 }

Ale w Order musisz mieć odniesienie do Produktu (nie tylko do Id)

Nawet gdy są takie wymagania to i tak pewnie zrobił 1 .. n a zabezpieczył przed dodaniem większej ilości

0

Super! Dokładnie o to mi chodziło!

Przepraszam, że tak późno odpisuje ale jednak musiałem zająć się innym modułem mojej apki. Chciałem zapytać czy można by do tego dodać jeszcze aby zliczało mi całkowity koszt, który zsumuje wszystkie całkowite koszty z każdego zamówienia. Próbowałem z tym dodając do VM pole TotalOrdersPrice i kombinowałem jednak coś nie wychodzi :/ Jakby się dało to jeszcze napisać to w formie query syntax (łatwiej mi się to analizuje a chciałbym to zrozumieć a nie tyko (copy&paste).

Z góry dziękuje.

Załatwiłem to tak:

**allOrders ** = wynik powyższego zapytania.

private TotalOrdersPrice = 0;

foreach (var item in allOrders)
{
     TotalOrdersPrice += item.TotalPrice;
}

hehe... myśle jednak w porównaniu do wcześniejszego rozwiązania to nie prezentuje się to zbyt elegancko :)

0

Może tak?:

TotalOrdersPrice = allOrders.Sum(item.TotalPrice);

1 użytkowników online, w tym zalogowanych: 0, gości: 1