private static void Main() { SelectQuery.Execute(); JoinQuery.Execute(); GroupByQuery.Execute(); OrderBy.Execute(); SubQuery.Execute(); }
private static void AddGroupByItemWrapper(GroupByQuery groupBy, List <LambdaExpression> elementProjections) { var keySelector = groupBy.KeySelector; var elementSelector = groupBy.ElementSelector; var keyType = keySelector.Body.Type; var elementType = elementSelector.Body.Type; var wrapperType = typeof(GroupByItemWrapper <,>).MakeGenericType(keyType, elementType); var wrapperKeyProperty = wrapperType.GetProperty("Key"); var wrapperElementProperty = wrapperType.GetProperty("Element"); var projectionParameter = keySelector.Parameters[0]; var projectionLambda = FastExpression.Lambda( Expression.MemberInit( Expression.New(wrapperType), Expression.Bind(wrapperKeyProperty, keySelector.Body), Expression.Bind(wrapperElementProperty, elementSelector.BindParameters(projectionParameter))), projectionParameter); groupBy.Source = QueryFactory.Select(groupBy.Source, projectionLambda); var wrapperParameter = Expression.Parameter(wrapperType, "wrapper"); var wrapperKeyAccess = Expression.MakeMemberAccess(wrapperParameter, wrapperKeyProperty); var wrapperElementAccess = Expression.MakeMemberAccess(wrapperParameter, wrapperElementProperty); groupBy.KeySelector = FastExpression.Lambda(wrapperKeyAccess, wrapperParameter); groupBy.ElementSelector = FastExpression.Lambda(wrapperElementAccess, wrapperParameter); for (int i = 0; i < elementProjections.Count; i++) { elementProjections[i] = FastExpression.Lambda( elementProjections[i].BindParameters(wrapperElementAccess), wrapperParameter); } }