Задача
У меня есть список объектов, которые должны быть сгруппированы по нескольким свойствам во время выполнения.
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. Тем не менее, я новичок, когда дело доходит до здания «Экспрессия». Правильный ли мой подход к этой проблеме? Есть ли более простой способ достичь этой функциональности? Может кто-нибудь мне помочь? Я был бы признателен за любую помощь на этом этапе, независимо от того, насколько она мала.
Спасибо всем