Um einen GroupBy-Ausdruck dynamisch zu generieren, versuche ich einen Linq-Ausdrucksbaum zu erstellen. Die Felder für die Gruppierung sind dynamisch und können sich in der Anzahl unterscheiden.Build GroupBy Ausdrucksbaum mit mehreren Feldern
Ich benutze diesen Code: (! Danke Mark Gravel)
string[] fields = {"Name", "Test_Result"};
Type studentType = typeof(Student);
var itemParam = Expression.Parameter(studentType, "x");
var addMethod = typeof(Dictionary<string, object>).GetMethod(
"Add", new[] { typeof(string), typeof(object) });
var selector = Expression.ListInit(
Expression.New(typeof(Dictionary<string,object>)),
fields.Select(field => Expression.ElementInit(addMethod,
Expression.Constant(field),
Expression.Convert(
Expression.PropertyOrField(itemParam, field),
typeof(object)
)
)));
var lambda = Expression.Lambda<Func<Student, Dictionary<string,object>>>(
selector, itemParam);
Der Code von this post kopiert wird.
Es schließt mit ...
var currentItemFields = students.Select(lambda.Compile());
... von denen erwartete ich, dass ich es ändern könnte ...
var currentItemFields = students.GroupBy(lambda.Compile());
ich davon ausgegangen, dass der Lambda-Ausdruck ist nicht mehr als ...
var currentItemFields = students.GroupBy(o => new { o.Name, o.Test_Result });
... aber unfortunally das nicht der Fall zu sein scheint. Die GroupBy mit einem dynamischen Lambda gibt keine Ausnahmen, es gruppiert einfach nichts und gibt alle Elemente zurück.
Was mache ich hier falsch? Jede Hilfe wäre willkommen. Danke im Voraus.
Wenn Sie aus dem erzeugten Ausdruck drucken, bevor es kompilieren, wie sieht es aus? – Servy
@Servy So: {x => neues Dictionary'2() {Void Add (System.String, System.Object) ("Shift", Konvertieren (x.Shift)), Void Add (System.String, System. Object) ("Section", Convert (x.Section))}} –
Es sollte also nicht offensichtlich sein, dass das Endergebnis ein Wörterbuch ist, und Sie wissen, dass die Gruppierung in einem Wörterbuch Vergleiche basierend auf Die Referenz des Wörterbuchs, nicht sein Inhalt, macht die Ergebnisse klar. – Servy