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)); }
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(); }