That lambda expression builds a dictionary of grouping fields.
Dictionary<TKey, TValue>
does not implement Equals()
and GetHashCode()
, so it groups them by reference equality.
Since you always return a new dictionary, each item gets its own group.
You need to change it to create a type that correctly implements Equals()
and GetHashCode()
for value equality.
Ordinarily, you would have the compiler generate an anonymous type. However, you can't do that here since you don't know the type signature at compile-time.
Instead, you can construct a Tuple<...>
:
Expression.New(
Type.GetType("System.Tuple`" + fields.Length)
.MakeGenericType(fields.Select(studentType.GetProperty),
fields.Select(f => Expression.PropertyOrField(itemParam, f))
)