Build GroupBy expression tree with multiple fields

前端 未结 2 594
被撕碎了的回忆
被撕碎了的回忆 2020-12-06 03:21

To dynamically generate a GroupBy expression, I am trying to build a Linq expression tree. The fields to group by are dynamic and can differ in number.

I use this co

2条回答
  •  北荒
    北荒 (楼主)
    2020-12-06 03:59

    This post shows a expression function which can be used for both Select and GroupBy. Hope it helps others!

    public Expression> GroupByExpression(string[] propertyNames)
    {
        var properties = propertyNames.Select(name => typeof(TItem).GetProperty(name)).ToArray();
        var propertyTypes = properties.Select(p => p.PropertyType).ToArray();
        var tupleTypeDefinition = typeof(Tuple).Assembly.GetType("System.Tuple`" + properties.Length);
        var tupleType = tupleTypeDefinition.MakeGenericType(propertyTypes);
        var constructor = tupleType.GetConstructor(propertyTypes);
        var param = Expression.Parameter(typeof(TItem), "item");
        var body = Expression.New(constructor, properties.Select(p => Expression.Property(param, p)));
        var expr = Expression.Lambda>(body, param);
        return expr;
    }  
    

    To be called like this:

    var lambda = GroupByExpression(fields);
    var currentItemFields = students.GroupBy(lambda.Compile());
    

提交回复
热议问题