/// <summary>
        /// Evaluates the specified expression.
        /// </summary>
        /// <param name="expression">The expression to evaluate.</param>
        /// <returns>Value of the expression.</returns>
        public virtual QueryValue Visit(LinqDefaultIfEmptyExpression expression)
        {
            var source = this.EvaluateCollection(expression.Source);

            if (source.Elements.Count == 0)
            {
                var elementType     = source.Type.ElementType;
                var queryClrType    = elementType as IQueryClrType;
                var queryScalarType = elementType as QueryScalarType;

                QueryValue defaultValue;

                if (expression.DefaultValue == null)
                {
                    if (queryScalarType != null && queryClrType != null && typeof(ValueType).IsAssignableFrom(queryClrType.ClrType))
                    {
                        defaultValue = queryScalarType.CreateValue(Activator.CreateInstance(queryClrType.ClrType));
                    }
                    else
                    {
                        defaultValue = elementType.NullValue;
                    }
                }
                else
                {
                    defaultValue = this.Evaluate(expression.DefaultValue);
                }

                return(source.Type.CreateCollectionWithValues(new QueryValue[] { defaultValue }));
            }

            return(source);
        }
Beispiel #2
0
        /// <summary>
        /// Generates System.CodeDom.CodeExpression from the given expression.
        /// </summary>
        /// <param name="expression">Expression from which System.CodeDom.CodeExpression is generated.</param>
        /// <returns>Generated System.CodeDom.CodeExpression.</returns>
        public virtual CodeExpression Visit(LinqDefaultIfEmptyExpression expression)
        {
            CodeExpression source = this.GenerateCode(expression.Source);

            if (expression.DefaultValue != null)
            {
                CodeExpression defaultValue = this.GenerateCode(expression.DefaultValue);
                return(source.Call("DefaultIfEmpty", defaultValue));
            }
            else
            {
                return(source.Call("DefaultIfEmpty"));
            }
        }
        /// <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(LinqDefaultIfEmptyExpression expression)
        {
            var source     = this.ResolveTypes(expression.Source);
            var sourceType = ValidateSourceIsACollection(source);

            if (expression.DefaultValue != null)
            {
                var defaultValue = this.ResolveTypes(expression.DefaultValue);
                return(new LinqDefaultIfEmptyExpression(source, sourceType, defaultValue));
            }
            else
            {
                return(new LinqDefaultIfEmptyExpression(source, sourceType));
            }
        }
Beispiel #4
0
        /// <summary>
        /// Replaces the given expression.
        /// </summary>
        /// <param name="expression">The root node of the expression tree being visited.</param>
        /// <returns>Replaced expression.</returns>
        public virtual QueryExpression Visit(LinqDefaultIfEmptyExpression expression)
        {
            QueryExpression source = this.ReplaceExpression(expression.Source);

            if (expression.DefaultValue != null)
            {
                QueryExpression defaultValue = this.ReplaceExpression(expression.DefaultValue);
                if (this.HasChanged(expression.Source, source) || this.HasChanged(expression.DefaultValue, defaultValue))
                {
                    return(new LinqDefaultIfEmptyExpression(source, expression.ExpressionType, defaultValue));
                }
            }

            if (this.HasChanged(expression.Source, source))
            {
                return(new LinqDefaultIfEmptyExpression(source, expression.ExpressionType));
            }

            return(expression);
        }
Beispiel #5
0
 /// <summary>
 /// Visits a QueryExpression tree whose root node is the LinqDefaultIfEmptyExpression.
 /// </summary>
 /// <param name="expression">The root node of the expression tree being visited.</param>
 /// <returns>Uri query string representing the expression.</returns>
 public virtual string Visit(LinqDefaultIfEmptyExpression expression)
 {
     throw new TaupoNotSupportedException("Not supported");
 }