要動態生成GroupBy表達式,我試圖構建一個Linq表達式樹。分組的字段是動態的,可以在數量上有所不同。構建GroupBy具有多個字段的表達式樹
我用這個代碼:(!謝謝馬克礫石)
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);
的代碼是從this post複製。
它定型與...
var currentItemFields = students.Select(lambda.Compile());
...而我希望我可以改變它......
var currentItemFields = students.GroupBy(lambda.Compile());
我認爲lambda表達式無非是...
var currentItemFields = students.GroupBy(o => new { o.Name, o.Test_Result });
......但不幸的是,似乎並非如此。具有動態lambda的GroupBy不會給出任何例外,它只是不分組並且返回所有元素。
我在這裏做錯了什麼?任何幫助,將不勝感激。提前致謝。
當你打印出生成的表達,編譯它之前,是什麼樣子? – Servy
@Servy像這樣:{x => new Dictionary'2(){Void Add(System.String,System.Object)(「Shift」,Convert(x.Shift)),Void Add(System.String,System。對象)(「Section」,Convert(x.Section))}} –
所以不應該從你看到的那裏明顯知道最終結果是一個字典,並且你知道字典上的分組將根據字典的參考,而不是其內容,使結果清晰。 – Servy