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