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