/// <summary>
        /// Resolves types for the specified expression.
        /// </summary>
        /// <param name="expression">The expression to resolve types for.</param>
        /// <returns>Expression with resolved types.</returns>
        public QueryExpression Visit(LinqNewExpression expression)
        {
            var members = expression.Members.Select(this.ResolveTypes).ToList();
            var type    = new QueryAnonymousStructuralType(this.EvaluationStrategy);

            for (int i = 0; i < members.Count; i++)
            {
                type.Add(QueryProperty.Create(expression.MemberNames[i], members[i].ExpressionType));
            }

            return(LinqBuilder.New(expression.MemberNames, members, type));
        }
 /// <summary>
 /// Visits a <see cref="QueryAnonymousStructuralType"/>.
 /// </summary>
 /// <param name="type">Query type being visited.</param>
 /// <returns>The result of visiting this query type.</returns>
 public ComparisonResult Visit(QueryAnonymousStructuralType type)
 {
     return(this.parent.CompareAnonymous((QueryStructuralValue)this.expectedValue, this.actualValue, this.path, this.shouldThrow));
 }
        /// <summary>
        /// Creates a QueryValue of a given type.
        /// </summary>
        /// <param name="type">Type of the QueryValue that will be generated.</param>
        /// <returns>QueryValue representing the provided object.</returns>
        public QueryValue Visit(QueryAnonymousStructuralType type)
        {
            var resultFragment = this.ResultFragmentStack.Pop();

            return(this.PopulateProperties(type.CreateNewInstance(), resultFragment));
        }