Inheritance: System.Linq.Expressions.Expression
        private Expression BindSelect(Type resultType, Expression source, LambdaExpression selector)
        {
            MetaProjectorExpression mp = AsProjection(Visit(source));
            Expression projector       = MapAndVisit(selector, mp);

            return(new MetaProjectorExpression(resultType, projector));
        }
        protected virtual Expression BindJoin(Type resultType, Expression outerSource, Expression innerSource, LambdaExpression outerKey, LambdaExpression innerKey, LambdaExpression resultSelector)
        {
            MetaProjectorExpression mpOuter = AsProjection(Visit(outerSource));
            MetaProjectorExpression mpInner = AsProjection(Visit(innerSource));
            Expression projector            = MapAndVisit(resultSelector, mpOuter, mpInner);

            return(new MetaProjectorExpression(resultType, projector));
        }
        private Expression BindGroupBy(Type resultType, Expression source, LambdaExpression keySelector, LambdaExpression elementSelector)
        {
            MetaProjectorExpression mp = AsProjection(Visit(source));
            Expression key             = MapAndVisit(keySelector, mp);
            Expression element         = MapAndVisit(elementSelector, mp);

            Type colType   = typeof(IEnumerable <>).MakeGenericType(element.Type);
            Type groupType = typeof(Grouping <,>).MakeGenericType(key.Type, element.Type);

            return(new MetaProjectorExpression(resultType,
                                               Expression.New(groupType.GetConstructor(new Type[] { key.Type, colType }),
                                                              key, new MetaProjectorExpression(colType, element))));
        }
        private Expression BindAggregate(Type resultType, AggregateSqlFunction aggregateFunction, Expression source, LambdaExpression selector)
        {
            MetaProjectorExpression mp = AsProjection(Visit(source));

            if (selector == null)
            {
                return(mp.Projector);
            }

            Expression projector = MapAndVisit(selector, mp);

            return(projector);
        }
        protected virtual Expression BindSelectMany(Type resultType, Expression source, LambdaExpression collectionSelector, LambdaExpression resultSelector)
        {
            MetaProjectorExpression mp = AsProjection(Visit(source));
            MetaProjectorExpression collectionProjector = AsProjection(MapAndVisit(collectionSelector, mp));

            if (resultSelector == null)
            {
                return(collectionProjector);
            }

            Expression resultProjection = MapAndVisit(resultSelector, mp, collectionProjector);

            return(new MetaProjectorExpression(resultType, resultProjection));
        }
Example #6
0
        public static MetaProjectorExpression AsProjection(Expression expression)
        {
            MetaProjectorExpression mpe = expression as MetaProjectorExpression;

            if (mpe != null)
            {
                return((MetaProjectorExpression)mpe);
            }

            if (expression.NodeType == ExpressionType.New)
            {
                NewExpression nex = (NewExpression)expression;
                if (nex.Type.IsInstantiationOf(typeof(Grouping <,>)))
                {
                    return((MetaProjectorExpression)nex.Arguments[1]);
                }
            }

            Type elementType = expression.Type.ElementType();

            if (elementType != null)
            {
                MetaExpression meta = expression as MetaExpression;
                if (meta != null && meta.Meta is CleanMeta)
                {
                    PropertyRoute route = ((CleanMeta)meta.Meta).PropertyRoutes.SingleEx(() => "PropertyRoutes for {0}. Metas don't work over polymorphic MLists".FormatWith(meta.Meta)).Add("Item");

                    return(new MetaProjectorExpression(expression.Type,
                                                       new MetaExpression(elementType,
                                                                          new CleanMeta(route.TryGetImplementations(), route))));
                }

                return(new MetaProjectorExpression(expression.Type,
                                                   MakeVoidMeta(elementType)));
            }

            throw new InvalidOperationException();
        }