GroupBy несколько свойств во вложенных объектах динамически - PullRequest
0 голосов
/ 02 мая 2018

Задача

У меня есть список объектов, которые должны быть сгруппированы по нескольким свойствам во время выполнения.

public class ParentClass {
    public int ID { get; set; }
    public string Name { get; set; }
    public NestedClassOne NestedOne { get; set; }
    public NestedClassThree NestedThree { get; set; }
}

public class NestedClassOne {
    public string Make { get; set; }
    public string Model { get; set; }
    public NestedClassTwo NestedTwo { get; set; }
}

public class NestedClassTwo {
    public string Data { get; set; }
}

public class NestedClassThree {
    public string Name { get; set; }
}

var data = new List<ParentClass> {
    new ParentClass {
        ID = 1,
        Name = "Car";
        NestedOne = new NestedClassOne {
            Make = "Toyota";
            Model = "Corolla";
            NestedTwo = new NestedClassTwo {
                Data = "Auto"
            };
        };
        NestedThree = new NestedClassThree {
            Name = "Smith";
        };
    },
    new ParentClass {
        ID = 2,
        Name = "Car";
        NestedOne = new NestedClassOne {
            Make = "Nissan";
            Model = "GTR";
            NestedTwo = new NestedClassTwo {
                Data = "Manual"
            };
        };
        NestedThree = new NestedClassThree {
            Name = "Taylor";
        };
    },
    new ParentClass {
        ID = 3,
        Name = "Car";
        NestedOne = new NestedClassOne {
            Make = "Toyota";
            Model = "Corolla";
            NestedTwo = new NestedClassTwo {
                Data = "Manual"
            };
        };
        NestedThree = new NestedClassThree {
            Name = "Jack";
        };
    },
    new ParentClass {
        ID = 4,
        Name = "Jeep";
        NestedOne = new NestedClassOne {
            Make = "Nissan";
            Model = "X-Trail";
            NestedTwo = new NestedClassTwo {
                Data = "Auto"
            };
        };
        NestedThree = new NestedClassThree {
            Name = "Jack";
        };
    },
    new ParentClass {
        ID = 5,
        Name = "Jeep";
        NestedOne = new NestedClassOne {
            Make = "Toyota";
            Model = "Vantage";
            NestedTwo = new NestedClassTwo {
                Data = "Manual"
            };
        };
        NestedThree = new NestedClassThree {
            Name = "Shawna";
        };
    }
};

Я получаю список имен свойств, таких как "Name", "NestedOne.NestedTwo.Data", "NestedOne.Make". Таким образом, используя этот список имен свойств, код должен сгруппировать приведенный выше список данных, чтобы над ними могли выполняться такие функции, как 'Count'.

подход

Я пытался использовать Reflection для получения значений свойств и создания нового ExpandoObject, который затем передавался бы в метод «GroupBy». Однако кажется, что ExpandoObjects не поддерживаются.

Поэтому, исследуя это, я столкнулся с удивительным решением здесь по этой ссылке.

GroupBy (params string [] fields) | Обзор кода StackExchanage

Это в значительной степени решает мою проблему, пока свойства находятся на самом родительском объекте. Он не поддерживает генерацию выражений для вложенных свойств, таких как "NestedOne.NestedTwo.Data", "NestedOne.Make".

Желаемый результат будет похож на этот.

Name    |  NestedOne.Make    |  NestedOne.NestedTwo.Data    |  Count
========|====================|==============================|=========
Car     |  Toyota            |  Manual                      |  27  
Car     |  Nissan            |  Manual                      |  09  
Jeep    |  Toyota            |  Auto                        |  15  
Jeep    |  Nissan            |  Auto                        |  36  

Запрос

Я довольно знаком с C-Sharp. Тем не менее, я новичок, когда дело доходит до здания «Экспрессия». Правильный ли мой подход к этой проблеме? Есть ли более простой способ достичь этой функциональности? Может кто-нибудь мне помочь? Я был бы признателен за любую помощь на этом этапе, независимо от того, насколько она мала.

Спасибо всем

...