Example #1
0
            internal override SqlExpression VisitSearchedCase(SqlSearchedCase c)
            {
                base.VisitSearchedCase(c);

                // determine the best common type for all the when and else values
                ProviderType type = c.Whens[0].Value.SqlType;

                for (int i = 1; i < c.Whens.Count; i++)
                {
                    ProviderType whenType = c.Whens[i].Value.SqlType;
                    type = typeProvider.GetBestType(type, whenType);
                }
                if (c.Else != null)
                {
                    ProviderType elseType = c.Else.SqlType;
                    type = typeProvider.GetBestType(type, elseType);
                }

                // coerce each one
                foreach (SqlWhen when in c.Whens.Where(w => w.Value.SqlType != type && !w.Value.SqlType.IsRuntimeOnlyType))
                {
                    when.Value = sql.UnaryConvert(when.Value.ClrType, type, when.Value, when.Value.SourceExpression);
                }

                if (c.Else != null && c.Else.SqlType != type && !c.Else.SqlType.IsRuntimeOnlyType)
                {
                    c.Else = sql.UnaryConvert(c.Else.ClrType, type, c.Else, c.Else.SourceExpression);
                }

                return(c);
            }