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