public S Execute <S>(Expression expression)
        {
            TransformMappingsMergerExpressionVisitor mergerVisitor = new TransformMappingsMergerExpressionVisitor();

            mergerVisitor.Visit(expression);


            TransformSelectInserterExpressionVisitor selectInserterVisitor = new TransformSelectInserterExpressionVisitor(mergerVisitor.TypeMappings);

            expression = selectInserterVisitor.Visit(expression);


            TransformExpressionVisitor visitor = new TransformExpressionVisitor(
                _source,
                mergerVisitor.TypeMappings,
                mergerVisitor.PropertyMappings,
                mergerVisitor.SelectParameterMappings,
                mergerVisitor.ContainerClassMappings);

            Expression newExpression = visitor.Visit(expression);

            return((S)_source.Provider.Execute(newExpression));
        }
        public IEnumerator <T> GetEnumerator()
        {
            TransformMappingsMergerExpressionVisitor mergerVisitor = new TransformMappingsMergerExpressionVisitor();

            mergerVisitor.Visit(_currentExpression);


            TransformSelectInserterExpressionVisitor selectInserterVisitor = new TransformSelectInserterExpressionVisitor(mergerVisitor.TypeMappings);
            Expression newExpression = selectInserterVisitor.Visit(_currentExpression);


            TransformExpressionVisitor visitor = new TransformExpressionVisitor(
                _source,
                mergerVisitor.TypeMappings,
                mergerVisitor.PropertyMappings,
                mergerVisitor.SelectParameterMappings,
                mergerVisitor.ContainerClassMappings);

            newExpression = visitor.Visit(newExpression);

            IQueryable <T> queryable = (IQueryable <T>)_source.Provider.CreateQuery(newExpression);

            return(queryable.GetEnumerator());
        }