Exemple #1
0
 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);
            }
        }