create anonymous type and group by it. :)
This commit is contained in:
		
							parent
							
								
									515d0bee37
								
							
						
					
					
						commit
						b624797330
					
				@ -99,8 +99,10 @@ namespace PoweredSoft.DynamicLinq.Helpers
 | 
			
		||||
            var constructor = anonymousType.GetConstructor(constructorTypes);
 | 
			
		||||
            var newExpression = Expression.New(constructor, partExpressions);
 | 
			
		||||
            var genericMethod = Constants.GroupByMethod.MakeGenericMethod(type, anonymousType);
 | 
			
		||||
 | 
			
		||||
            return query;
 | 
			
		||||
            var lambda = Expression.Lambda(newExpression, parameter);
 | 
			
		||||
            var groupByExpression = Expression.Call(genericMethod, query.Expression, lambda);
 | 
			
		||||
            var result = query.Provider.CreateQuery(groupByExpression);
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static IQueryable GroupBy(IQueryable query, Type type, string path)
 | 
			
		||||
 | 
			
		||||
@ -50,10 +50,34 @@ namespace PoweredSoft.DynamicLinq.Helpers
 | 
			
		||||
            {
 | 
			
		||||
                CreatePropertyOnType(dynamicType, field.name, field.type);
 | 
			
		||||
            });
 | 
			
		||||
            CreateConstructorWithAllPropsOnType(dynamicType, fields);
 | 
			
		||||
            var ret = dynamicType.CreateTypeInfo();
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static void CreateConstructorWithAllPropsOnType(TypeBuilder dynamicType, List<(Type type, string name)> fields)
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = dynamicType.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, fields.Select(t => t.type).ToArray());
 | 
			
		||||
            var parameters = fields
 | 
			
		||||
                .Select((field, i) =>
 | 
			
		||||
               {
 | 
			
		||||
                   return ctor.DefineParameter(i++, ParameterAttributes.None, $"{field.name}_1");
 | 
			
		||||
               })
 | 
			
		||||
               .ToList();
 | 
			
		||||
 | 
			
		||||
            var emitter = ctor.GetILGenerator();
 | 
			
		||||
            emitter.Emit(OpCodes.Nop);
 | 
			
		||||
 | 
			
		||||
            // Load `this` and call base constructor with arguments
 | 
			
		||||
            emitter.Emit(OpCodes.Ldarg_0);
 | 
			
		||||
            for (var i = 1; i <= parameters.Count; ++i)
 | 
			
		||||
            {
 | 
			
		||||
                emitter.Emit(OpCodes.Ldarg, i);
 | 
			
		||||
            }
 | 
			
		||||
            emitter.Emit(OpCodes.Call, ctor);
 | 
			
		||||
            emitter.Emit(OpCodes.Ret);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static void CreatePropertyOnType(TypeBuilder typeBuilder, string propertyName, Type propertyType)
 | 
			
		||||
        {
 | 
			
		||||
            // Generate a property called "Name"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user