private static object Aggregate <T>(IQueryable <T> queryable, IEnumerable <Aggregator> aggregates) { if (aggregates != null && aggregates.Any()) { var objProps = new Dictionary <DynamicProperty, object>(); var groups = aggregates.GroupBy(g => g.Field); Type type = null; foreach (var group in groups) { var fieldProps = new Dictionary <DynamicProperty, object>(); foreach (var aggregate in group) { var prop = typeof(T).GetProperty(aggregate.Field); var param = Expression.Parameter(typeof(T), "s"); var selector = aggregate.Aggregate == "count" && (Nullable.GetUnderlyingType(prop.PropertyType) != null) ? Expression.Lambda(Expression.NotEqual(Expression.MakeMemberAccess(param, prop), Expression.Constant(null, prop.PropertyType)), param) : Expression.Lambda(Expression.MakeMemberAccess(param, prop), param); var mi = aggregate.MethodInfo(typeof(T)); if (mi == null) { continue; } var val = queryable.Provider.Execute(Expression.Call(null, mi, aggregate.Aggregate == "count" && (Nullable.GetUnderlyingType(prop.PropertyType) == null) ? new[] { queryable.Expression } : new[] { queryable.Expression, Expression.Quote(selector) })); fieldProps.Add(new DynamicProperty(aggregate.Aggregate, typeof(object)), val); } type = DynamicClass.CreateType(fieldProps.Keys.ToList()); var fieldObj = Activator.CreateInstance(type); foreach (var p in fieldProps.Keys) { type.GetProperty(p.Name).SetValue(fieldObj, fieldProps[p], null); } objProps.Add(new DynamicProperty(group.Key, fieldObj.GetType()), fieldObj); } type = DynamicClass.CreateType(objProps.Keys.ToList()); var obj = Activator.CreateInstance(type); foreach (var p in objProps.Keys) { type.GetProperty(p.Name).SetValue(obj, objProps[p], null); } return(obj); } else { return(null); } }
public static Type CreateType(IList <DynamicProperty> properties, bool createParameterCtor) { return(DynamicClassFactory.CreateType(properties, createParameterCtor)); //return ClassFactory.Instance.CreateType(properties); }