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