Next allow the possibility to specify the class type to group by :)

This commit is contained in:
David Lebée 2018-03-11 22:16:51 -05:00
parent b624797330
commit 9db5d74284
2 changed files with 13 additions and 3 deletions

View File

@ -81,7 +81,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
{ {
// EXPRESSION // EXPRESSION
var parameter = Expression.Parameter(type, "t"); var parameter = Expression.Parameter(type, "t");
var partExpressions = new List<Expression>(); var partExpressions = new List<(Expression expression, string propertyName)>();
var fields = new List<(Type type, string propertyName)>(); var fields = new List<(Type type, string propertyName)>();
@ -90,17 +90,27 @@ namespace PoweredSoft.DynamicLinq.Helpers
{ {
var partExpression = ResolvePathForExpression(parameter, part.path); var partExpression = ResolvePathForExpression(parameter, part.path);
fields.Add((partExpression.Type, part.propertyName)); fields.Add((partExpression.Type, part.propertyName));
partExpressions.Add(partExpression); partExpressions.Add((partExpression, part.propertyName));
}); });
var anonymousType = TypeHelpers.CreateSimpleAnonymousType(fields); var anonymousType = TypeHelpers.CreateSimpleAnonymousType(fields);
/*
var constructorTypes = fields.Select(t => t.type).ToArray(); var constructorTypes = fields.Select(t => t.type).ToArray();
var constructor = anonymousType.GetConstructor(constructorTypes); var constructor = anonymousType.GetConstructor(constructorTypes);
var newExpression = Expression.New(constructor, partExpressions); var newExpression = Expression.New(constructor, partExpressions);
var genericMethod = Constants.GroupByMethod.MakeGenericMethod(type, anonymousType); var genericMethod = Constants.GroupByMethod.MakeGenericMethod(type, anonymousType);
var lambda = Expression.Lambda(newExpression, parameter); var lambda = Expression.Lambda(newExpression, parameter);
var groupByExpression = Expression.Call(genericMethod, query.Expression, lambda); var groupByExpression = Expression.Call(genericMethod, query.Expression, lambda);
var result = query.Provider.CreateQuery(groupByExpression);*/
var ctor = Expression.New(anonymousType);
var bindings = partExpressions.Select(partExpression => Expression.Bind(anonymousType.GetProperty(partExpression.propertyName), partExpression.expression)).ToList();
var mi = Expression.MemberInit(ctor, bindings.ToArray());
var lambda = Expression.Lambda(mi, parameter);
var genericMethod = Constants.GroupByMethod.MakeGenericMethod(type, anonymousType);
var groupByExpression = Expression.Call(genericMethod, query.Expression, lambda);
var result = query.Provider.CreateQuery(groupByExpression); var result = query.Provider.CreateQuery(groupByExpression);
return result; return result;
} }

View File

@ -50,7 +50,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
{ {
CreatePropertyOnType(dynamicType, field.name, field.type); CreatePropertyOnType(dynamicType, field.name, field.type);
}); });
CreateConstructorWithAllPropsOnType(dynamicType, fields); // CreateConstructorWithAllPropsOnType(dynamicType, fields);
var ret = dynamicType.CreateTypeInfo(); var ret = dynamicType.CreateTypeInfo();
return ret; return ret;
} }