예제 #1
0
    private Expression BindSelect(Type resultType, Expression source, LambdaExpression selector)
    {
        MetaProjectorExpression mp = AsProjection(Visit(source));
        Expression projector       = MapAndVisit(selector, mp);

        return(new MetaProjectorExpression(resultType, projector));
    }
예제 #2
0
    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));
    }
예제 #3
0
    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))));
    }
예제 #4
0
    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);
    }
예제 #5
0
    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));
    }