示例#1
0
        private SqlExpression TranslateEqualsOp(SqlNodeType op, SqlExpression left, SqlExpression right, bool allowExpand)
        {
            switch (op)
            {
            case SqlNodeType.EQ:
            case SqlNodeType.NE:
                return(this.sql.Binary(op, left, right));

            case SqlNodeType.EQ2V:
            {
                if ((SqlExpressionNullability.CanBeNull(left) != false) && (SqlExpressionNullability.CanBeNull(right) != false))
                {
                    SqlNodeType type = allowExpand ? SqlNodeType.EQ2V : SqlNodeType.EQ;
                    return(this.sql.Binary(SqlNodeType.Or, this.sql.Binary(SqlNodeType.And, this.sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(left)), this.sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(right))),
                                           this.sql.Binary(SqlNodeType.And, this.sql.Binary(SqlNodeType.And, this.sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(left)), this.sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(right))), this.sql.Binary(type, left, right))));
                }
                SqlNodeType nodeType = allowExpand ? SqlNodeType.EQ2V : SqlNodeType.EQ;
                return(this.sql.Binary(nodeType, left, right));
            }

            case SqlNodeType.NE2V:
            {
                if ((SqlExpressionNullability.CanBeNull(left) == false) || (SqlExpressionNullability.CanBeNull(right) == false))
                {
                    SqlNodeType type4 = allowExpand ? SqlNodeType.NE2V : SqlNodeType.NE;
                    return(this.sql.Binary(type4, left, right));
                }
                SqlNodeType type3 = allowExpand ? SqlNodeType.EQ2V : SqlNodeType.EQ;
                return(this.sql.Unary(SqlNodeType.Not, this.sql.Binary(SqlNodeType.Or, this.sql.Binary(SqlNodeType.And, this.sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(left)), this.sql.Unary(SqlNodeType.IsNull, (SqlExpression)SqlDuplicator.Copy(right))), this.sql.Binary(SqlNodeType.And, this.sql.Binary(SqlNodeType.And, this.sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(left)), this.sql.Unary(SqlNodeType.IsNotNull, (SqlExpression)SqlDuplicator.Copy(right))), this.sql.Binary(type3, left, right)))));
            }
            }
            throw Error.UnexpectedNode(op);
        }
示例#2
0
            private SqlExpression TryToWriteAsSimpleBooleanExpression(Type caseType, SqlExpression discriminator, List <SqlWhen> newWhens, bool allValuesLiteral)
            {
                SqlExpression left = null;

                if ((caseType != typeof(bool)) || !allValuesLiteral)
                {
                    return(left);
                }
                bool?nullable  = SqlExpressionNullability.CanBeNull(discriminator);
                bool?nullable2 = null;

                for (int i = 0; i < newWhens.Count; i++)
                {
                    SqlValue value2 = (SqlValue)newWhens[i].Value;
                    bool     flag   = (bool)value2.Value;
                    if (newWhens[i].Match != null)
                    {
                        if (flag)
                        {
                            left = this.sql.OrAccumulate(left, this.sql.Binary(SqlNodeType.EQ, discriminator, newWhens[i].Match));
                        }
                        else
                        {
                            left = this.sql.AndAccumulate(left, this.sql.Binary(SqlNodeType.NE, discriminator, newWhens[i].Match));
                        }
                    }
                    else
                    {
                        nullable2 = new bool?(flag);
                    }
                }
                if ((nullable == false) || !nullable2.HasValue)
                {
                    return(left);
                }
                if (nullable2 == true)
                {
                    return(this.sql.OrAccumulate(left, this.sql.Unary(SqlNodeType.IsNull, discriminator, discriminator.SourceExpression)));
                }
                return(this.sql.AndAccumulate(left, this.sql.Unary(SqlNodeType.IsNotNull, discriminator, discriminator.SourceExpression)));
            }
示例#3
0
            internal override SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression)
            {
                SqlExpression expression  = this.sql.ValueFromObject(true, false, predicateExpression.SourceExpression);
                SqlExpression expression2 = this.sql.ValueFromObject(false, false, predicateExpression.SourceExpression);

                //if (SqlExpressionNullability.CanBeNull(predicateExpression) != false)
                if (SqlExpressionNullability.CanBeNull(predicateExpression) == true)
                {
                    return(new SqlSearchedCase(predicateExpression.ClrType,
                                               new[] { new SqlWhen(predicateExpression, expression),
                                                       new SqlWhen(new SqlUnary(SqlNodeType.Not, predicateExpression.ClrType,
                                                                                predicateExpression.SqlType, predicateExpression,
                                                                                predicateExpression.SourceExpression), expression2) },
                                               sql.Value(expression.ClrType, expression.SqlType, null, false,
                                                         predicateExpression.SourceExpression),
                                               predicateExpression.SourceExpression));
                }
                return(new SqlSearchedCase(predicateExpression.ClrType,
                                           new SqlWhen[] { new SqlWhen(predicateExpression, expression) }, expression2,
                                           predicateExpression.SourceExpression));
            }