private TranslateResult Translate(Expression expression)
        {
            var projection = expression as ProjectionExpression;
            var subQuery   = expression as SubQueryProjection;
            var groupQuery = expression as GroupingProjection;

            if (groupQuery != null)
            {
                throw new TabularException("Can't Return groups from group by you must use aggregates, or retrieve the complete table and run groupng in Linq to objects");
                ////var query = new TabularGroupByRewriter(groupQuery).Rewrite();
                ////return Translate(query);
            }
            if (subQuery != null)
            {
                projection = subQuery.Projection;
            }
            expression = TabularEvaluator.PartialEval(expression);
            var binder          = new TabularQueryBinder(this);
            var boundExpression = binder.Bind(expression);
            var orders          = binder.OrderByColumns;

            if (projection == null && subQuery == null)
            {
                if (boundExpression is ProjectionExpression)
                {
                    projection = (ProjectionExpression)boundExpression;
                }

                else
                {
                    return(Translate(boundExpression));
                }
            }

            if (projection == null)
            {
                throw new TabularException("Could not translate");
            }

            string commandText = new TabularQueryFormatter().Format(projection.Source, orders);

            LambdaExpression projector = new ProjectionBuilder().Build(projection.Projector);

            return
                (new TranslateResult
            {
                CommandText = commandText,
                Projector = projector
            });
        }
        protected override Expression VisitConstant(ConstantExpression node)
        {
            //return base.VisitConstant(node);
            var v    = node.Value;
            var keys = _memberMapping.Keys.ToList();

            foreach (var member in keys)
            {
                var m = v.GetType().GetMember(member.Name).FirstOrDefault();
                if (m != null && m.ReflectedType == member.ReflectedType)
                {
                    var accessor = TabularEvaluator.PartialEval(Expression.MakeMemberAccess(node, m));
                    var t1       = _memberMapping[member].Item1;
                    _memberMapping[member] = new Tuple <Expression, Expression>(t1, accessor);
                }
            }
            return(node);
        }