//internal static Expression JustVisit(LambdaExpression expression, PropertyRoute route)
        //{
        //    if (route.Type.IsLite())
        //        route = route.Add("Entity");

        //    return JustVisit(expression, ));
        //}

        internal static Expression JustVisit(LambdaExpression expression, MetaExpression metaExpression)
        {
            var cleaned = MetaEvaluator.Clean(expression);

            var replaced = ExpressionReplacer.Replace(Expression.Invoke(cleaned, metaExpression));

            return(new MetadataVisitor().Visit(replaced));
        }
        static internal Dictionary <string, Meta> GatherMetadata(Expression expression)
        {
            if (expression == null)
            {
                throw new ArgumentException("expression");
            }

            if (!typeof(IQueryable).IsAssignableFrom(expression.Type))
            {
                throw new InvalidOperationException("Expression type is not IQueryable");
            }

            Expression simplified = MetaEvaluator.Clean(expression);

            MetaProjectorExpression meta = new MetadataVisitor().Visit(simplified) as MetaProjectorExpression;

            if (meta == null)
            {
                return(null);
            }

            var proj = meta.Projector;

            if (proj.NodeType != ExpressionType.New &&                        //anonymous types
                proj.NodeType != ExpressionType.MemberInit &&                 // not-anonymous type
                !(proj is MetaExpression && ((MetaExpression)proj).IsEntity)) // raw-entity!
            {
                return(null);
            }

            PropertyInfo[] props = proj.Type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            return(props.ToDictionary(pi => pi.Name, pi =>
            {
                Expression ex = BindMember(proj, pi, pi.PropertyType);
                return (ex as MetaExpression)?.Meta;
            }));
        }