wielopoziomowe grupawanie

0

Witam

Mam w bazie tabelę Sales, w której zapisuję dane: Ilość, użytkownika oraz podkategorię, podkategoria znów zawiera kategorię główną.

    public class Category
    {
        public int ID { get; set; }
        public string name { get; set; }
        public virtual List<SubCategory> MyProperty { get; set; }
    }

    public class SubCategory
    {
        public int ID { get; set; }
        public string name { get; set; }
        public Category Category { get; set; }
    }

    public class Person
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }


    public class Sales
    {
        public int ID { get; set; }
        public SubCategory SubCategory { get; set; }
        public int SubCategoryID { get; set; }
        public Person Person { get; set; }
        public int PersonID { get; set; }
        public int Qty { get; set; }
    }

I potrzebuję stworzyć zapytanie linq zwracające wielopoziomowo podrupowane dane, jako pierwszy poziom pogrupowane po użytkowniku oraz zsumowana ilość, drugi poziom będący podrupą użytkownika to dane podrupowane po kategorii z sumowaną ilością dla tej podkategorii, a trzeci poziom będący podgrupą poprzedniej podgrupy to dane pogrupowane po subkategori z zumowaną wartością dla każdej podkategorii - takie drzewko, im wyżej tym bardziej zawężone dane i sumy dla pola Qty.

Przy wykorzystaniu select w linq dostaję podzbiór poziomu niżej, i o ile w pierszym select mam dostęp do pola Qty które sumuję, to już w kolejnych mam dostęp do Person / SubCategory a dalej do Category.

Ktoś pomoże jak osiągnąć to stosując linq ?

0

Czy Ty chcesz to na siłę walnąć 1 LINQ chainem?

Mógłbyś pokazać tą swoją wynikową strukturę jako np. json/klasa?

0
WeiXiao napisał(a):

Mógłbyś pokazać tą swoją wynikową strukturę jako np. json/klasa?

Tak, ostatecznie leci to to json.

0

Poniżej zapytanie

            var result = salesList.Where(m => m.date == date)
            .GroupBy(m => m.Person)
            .Select(m => new
            {
                Qty = m.Sum(x => x.Qty),
                LastName = m.Select(x => x.Person.FirstName),
                MainCategory = m.Select(x => x.SubCategory.Category)
                            .GroupBy(x => x.name)
                            .Select(k => new {
                                // <------- tu suma dla wybranego użytkownika i kategorii (pole Qty)
                                MainCategoryName = k.Select(h => h.name)


                                // <------- tu kolejna podkategoria zawierająca dane pogrupowane
                                // po podkategorii oraz sumę dla tej podkategorii i użytkownika
                            })

            });

Potrzebuję dodać podgrupy jak wskazują komentarze w zapytaniu.

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