/// <summary> /// Creates a <see cref="DbBinaryExpression"/>. /// </summary> /// <param name="binaryExpressionType">The <see cref="DbBinaryExpressionType"/> that specifies the type of binary expression to create.</param> /// <param name="leftExpression">A <see cref="DbExpression"/> that represents the left operand.</param> /// <param name="rightExpression">A <see cref="DbExpression"/> that represents the right operand.</param> /// <returns>A <see cref="DbBinaryExpression"/> instance.</returns> public DbBinaryExpression MakeBinary(DbBinaryExpressionType binaryExpressionType, DbExpression leftExpression, DbExpression rightExpression) { var binaryExpression = new DbBinaryExpression(binaryExpressionType, leftExpression, rightExpression); return binaryExpression; }
/// <summary> /// Translates the <paramref name="binaryExpression"/> into a string representation. /// </summary> /// <param name="binaryExpression">The <see cref="DbBinaryExpression"/> to translate.</param> /// <returns><see cref="string"/></returns> protected override DbExpression VisitBinaryExpression(DbBinaryExpression binaryExpression) { var body = "({0}{1}{2})"; if (binaryExpression.BinaryExpressionType == DbBinaryExpressionType.Assignment) { body = "{0} = {1}"; return ExpressionFactory.Sql(string.Format(body, Visit(binaryExpression.LeftExpression), Visit(binaryExpression.RightExpression))); } var leftExpression = Visit(binaryExpression.LeftExpression); var rightExpression = Visit(binaryExpression.RightExpression); if (binaryExpression.RightExpression.ExpressionType == DbExpressionType.Constant && ((DbConstantExpression)binaryExpression.RightExpression).Value == null) { if (binaryExpression.BinaryExpressionType == DbBinaryExpressionType.Equal) return ExpressionFactory.Sql(string.Format("({0} IS {1})", leftExpression, rightExpression)); if (binaryExpression.BinaryExpressionType == DbBinaryExpressionType.NotEqual) return ExpressionFactory.Sql(string.Format("({0} IS NOT {1})", leftExpression, rightExpression)); } if (binaryExpression.LeftExpression.ExpressionType == DbExpressionType.Constant && ((DbConstantExpression)binaryExpression.LeftExpression).Value == null) { if (binaryExpression.BinaryExpressionType == DbBinaryExpressionType.Equal) return ExpressionFactory.Sql(string.Format("({0} IS {1})", rightExpression, leftExpression)); if (binaryExpression.BinaryExpressionType == DbBinaryExpressionType.NotEqual) return ExpressionFactory.Sql(string.Format("({0} IS NOT {1})", rightExpression, leftExpression)); } var sqlFragment = string.Format(body, leftExpression, GetBinaryOperator(binaryExpression.BinaryExpressionType), rightExpression); return ExpressionFactory.Sql(sqlFragment); }
/// <summary> /// Translates the <paramref name="binaryExpression"/> into a string representation. /// </summary> /// <param name="binaryExpression">The <see cref="DbBinaryExpression"/> to translate.</param> /// <returns><see cref="DbExpression"/></returns> protected virtual DbExpression VisitBinaryExpression(DbBinaryExpression binaryExpression) { var leftExpression = Visit(binaryExpression.LeftExpression); var rightExpression = Visit(binaryExpression.RightExpression); if (!leftExpression.Equals(binaryExpression.LeftExpression) || rightExpression.Equals(binaryExpression.RightExpression)) { return ExpressionFactory.MakeBinary(binaryExpression.BinaryExpressionType, leftExpression, rightExpression); } return binaryExpression; }