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