I have this code got from a site which is not compiling in .net v4.5.2. please have a look.
public static DataTable ToPivotTable<T, TPivot>(
this IEnumerable<T> source,
IReadOnlyList<Expression<Func<T, object>>> groupColumns,
Func<T, string> pivotColumn, Func<T, TPivot> pivotValue)
{
var result = new DataTable();
var groupColumnMembers = groupColumns.Select(c => ((MemberExpression)c.Body).Member).Cast<PropertyInfo>().ToList();
foreach (var groupColumn in groupColumnMembers)
{
result.Columns.Add(new DataColumn(groupColumn.Name, groupColumn.PropertyType));
}
var p = Expression.Parameter(typeof(T), "p");
var tupleType = Type.GetType($"System.Tuple`{groupColumns.Count}");
var groupColumnTypes = groupColumnMembers.Select(x => x.PropertyType).ToArray();
var tupleConstructor = tupleType.MakeGenericType(groupColumnTypes).GetConstructor(groupColumnTypes);
var args = groupColumnMembers.Select(c => Expression.Property(p, c));
var body = Expression.New(tupleConstructor, args);
var groupByExpression = Expression.Lambda<Func<T, System.Runtime.CompilerServices.ITuple>>(body, p);
foreach (var group in source.GroupBy(groupByExpression.Compile()))
{
foreach (T element in group)
{
string pivotColumnName = pivotColumn(element);
if (!result.Columns.Contains(pivotColumnName))
{
result.Columns.Add(new DataColumn(pivotColumnName, typeof(TPivot)));
}
}
var row = result.NewRow();
for (int index = 0; index < group.Key.Length; index++)
{
row[index] = group.Key[index];
}
foreach (T element in group)
{
string pivotColumnName = pivotColumn(element);
TPivot pivotColumnValue = pivotValue(element);
row[pivotColumnName] = pivotColumnValue;
}
result.Rows.Add(row);
}
return result;
}
Calling this way
DataTable pivotedData = _data.ToPivotTable(
new List<Expression<Func<Data, object>>>
{
d => d.Section,
d => d.Lineitem,
d => d.BrokerCode,
d => d.BrokerName
},
d => d.Period,
d => d.PeriodValue);
When i try to compile above code then i am getting error for these below line which may work in .net upper version.
var tupleType = Type.GetType($"System.Tuple`{groupColumns.Count}");
var groupByExpression = Expression.Lambda<Func<T, System.Runtime.CompilerServices.ITuple>>(body, p);
foreach (var group in source.GroupBy(groupByExpression.Compile()))
{
}
Please some one help me to convert the above code as a result it should work in .net version 4.5.2
Thanks
