Shawn asked me in my last post about GroupByMany how to use it dynamically.
The answer is not easy. So here is a new post to answer to this interesting question.
First you must learn a few things about being dynamic with linq.
There is a very good sample from the C# team (actually we can consider it as a library provided as a sample). ScottGu has post about it here: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.
One of the power of linq is to be checked at compile-time. You must be aware that using this kind of solution may raise some exceptions at runtime.
Now I have added the Dynamic.cs file to my project and I can use a very useful method: DynamicExpression.ParseLambda.
Here is a new GroupByMany extension method which accepts a list of strings instead of delegates to define all the groupings.
The goal is to call the first GroupByMany method. To do this we have to go from a single string defining the name of a property in the TElement class to a Func<TElement, object>.
We could do this building the expression manually but DynamicExpression.ParseLambda will do it in just a single line.
public static class MyEnumerableExtensions
public static IEnumerable<GroupResult> GroupByMany<TElement>(
this IEnumerable<TElement> elements, params string groupSelectors)
var selectors =
new List<Func<TElement, object>>(groupSelectors.Length);
foreach (var selector in groupSelectors)
LambdaExpression l =
typeof(TElement), typeof(object), selector);
selectors.Add((Func<TElement, object>) l.Compile());
DataContext = customers.GroupByMany("Country", "City");
instead of :
DataContext = customers.GroupByMany(c => c.Country, c => c.City);
The full project is attached to this post. (VS2008.)