我试图通过迭代表中的列来简化我的代码,并使用每列映射到一个值,而不是让多行代码具有单个不同的值。 所以从这里开始:
foreach(var n in groupedResults){
SetCellForData("Column1", n.Sum(x => x.ColumnName1FromTable));
SetCellForData("Column2", n.Sum(x => x.ColumnName2FromTable));
...
SetCellForData("Column10", n.Sum(x => x.ColumnName10FromTable));
}
对于这样的事情:
var columnProperties = typeof(TableClass).GetProperties().Select(t => t);
foreach(var n in groupedResults){
foreach(var columnProperty in columnProperties ){
SetCellForData(columnProperty.Name, n.Sum(x => x.????);
}
}
哪里???? part使用columnProperty对n个分组结果中的列求和。
答案 0 :(得分:0)
由于arekzyla在我确认这是我需要的之前决定删除他的答案,所以我决定用arekzyla的答案回答我自己的问题。
此方法创建函数:
private static Func<T, U> GetPropertyFunc<T, U>(string propertyName)
{
var parameter = Expression.Parameter(typeof(T));
var body = Expression.PropertyOrField(parameter, propertyName);
var lambda = Expression.Lambda<Func<T, U>>(body, parameter);
return lambda.Compile();
}
此代码遍历数据库类型中的属性,并为每个属性创建一个返回整数的函数。
var columnProperties = typeof(DatabaseType).GetProperties()
.Where(x => x.PropertyType == typeof(int))
.Select(t => new { t.Name, GetPropertyFunc = GetPropertyFunc<DatabaseType, int>(t.Name) })
.ToList();
然后我们迭代一些分组列表:
foreach (var n in groupedList)
{
foreach (var property in columnProperties)
{
var sumOfElementsInGrouping = n.Sum(x => property.GetPropertyFunc(x));
}
}
然后我们根据属性得到特定列的总和。