protected override Expression VisitBinary(BinaryExpression node) { #if (DEBUG_VISITS) System.Diagnostics.Debug.Print("VisitBinary: {0}", node); #endif var expression = base.VisitBinary(node) as BinaryExpression; DbExpression dbExpression; // Need special handling for comparisons against the null constant. If we don't translate these // using an "IsNull" expression, EF will convert it literally as "= null" which doesn't work in SQL Server. if (IsNullConstantExpression(expression.Right)) { dbExpression = MapNullComparison(expression.Left, expression.NodeType); } else if (IsNullConstantExpression(expression.Left)) { dbExpression = MapNullComparison(expression.Right, expression.NodeType); } else { DbExpression leftExpression = GetDbExpressionForExpression(expression.Left); DbExpression rightExpression = GetDbExpressionForExpression(expression.Right); switch (expression.NodeType) { case ExpressionType.Equal: // DbPropertyExpression = class property that has been mapped to a database column // DbParameterReferenceExpression = lambda parameter if (IsNullableExpressionOfType <DbPropertyExpression>(leftExpression) && IsNullableExpressionOfType <DbParameterReferenceExpression>(rightExpression)) { dbExpression = CreateEqualComparisonOfNullablePropToNullableParam(leftExpression, rightExpression); } else if (IsNullableExpressionOfType <DbPropertyExpression>(rightExpression) && IsNullableExpressionOfType <DbParameterReferenceExpression>(leftExpression)) { dbExpression = CreateEqualComparisonOfNullablePropToNullableParam(rightExpression, leftExpression); } else { dbExpression = DbExpressionBuilder.Equal(leftExpression, rightExpression); } break; case ExpressionType.NotEqual: dbExpression = DbExpressionBuilder.NotEqual(leftExpression, rightExpression); break; case ExpressionType.GreaterThan: dbExpression = DbExpressionBuilder.GreaterThan(leftExpression, rightExpression); break; case ExpressionType.GreaterThanOrEqual: dbExpression = DbExpressionBuilder.GreaterThanOrEqual(leftExpression, rightExpression); break; case ExpressionType.LessThan: dbExpression = DbExpressionBuilder.LessThan(leftExpression, rightExpression); break; case ExpressionType.LessThanOrEqual: dbExpression = DbExpressionBuilder.LessThanOrEqual(leftExpression, rightExpression); break; case ExpressionType.AndAlso: dbExpression = DbExpressionBuilder.And(leftExpression, rightExpression); break; case ExpressionType.OrElse: dbExpression = DbExpressionBuilder.Or(leftExpression, rightExpression); break; case ExpressionType.And: dbExpression = EdmFunctions.BitwiseAnd(leftExpression, rightExpression); break; case ExpressionType.Or: dbExpression = EdmFunctions.BitwiseOr(leftExpression, rightExpression); break; case ExpressionType.ExclusiveOr: dbExpression = EdmFunctions.BitwiseXor(leftExpression, rightExpression); break; case ExpressionType.Coalesce: // EF does not expose the "coalesce" function. So best we can do is a case statement. Issue #77. var whenExpressions = new List <DbExpression>() { DbExpressionBuilder.IsNull(leftExpression) }; var thenExpressions = new List <DbExpression>() { rightExpression }; dbExpression = DbExpressionBuilder.Case(whenExpressions, thenExpressions, leftExpression); break; default: throw new NotImplementedException(string.Format("Unhandled NodeType of {0} in LambdaToDbExpressionVisitor.VisitBinary", expression.NodeType)); } } MapExpressionToDbExpression(expression, dbExpression); return(expression); }
protected override Expression VisitBinary(BinaryExpression node) { #if (DEBUGPRINT) System.Diagnostics.Debug.Print("VisitBinary: {0}", node); #endif var expression = base.VisitBinary(node) as BinaryExpression; DbExpression dbExpression; // Need special handling for comparisons against the null constant. If we don't translate these // using an "IsNull" expression, EF will convert it literally as "= null" which doesn't work in SQL Server. if (IsNullConstantExpression(expression.Right)) { dbExpression = MapNullComparison(expression.Left, expression.NodeType); } else if (IsNullConstantExpression(expression.Left)) { dbExpression = MapNullComparison(expression.Right, expression.NodeType); } else { DbExpression leftExpression = GetDbExpressionForExpression(expression.Left); DbExpression rightExpression = GetDbExpressionForExpression(expression.Right); switch (expression.NodeType) { case ExpressionType.Equal: dbExpression = DbExpressionBuilder.Equal(leftExpression, rightExpression); break; case ExpressionType.NotEqual: dbExpression = DbExpressionBuilder.NotEqual(leftExpression, rightExpression); break; case ExpressionType.GreaterThan: dbExpression = DbExpressionBuilder.GreaterThan(leftExpression, rightExpression); break; case ExpressionType.GreaterThanOrEqual: dbExpression = DbExpressionBuilder.GreaterThanOrEqual(leftExpression, rightExpression); break; case ExpressionType.LessThan: dbExpression = DbExpressionBuilder.LessThan(leftExpression, rightExpression); break; case ExpressionType.LessThanOrEqual: dbExpression = DbExpressionBuilder.LessThanOrEqual(leftExpression, rightExpression); break; case ExpressionType.AndAlso: dbExpression = DbExpressionBuilder.And(leftExpression, rightExpression); break; case ExpressionType.OrElse: dbExpression = DbExpressionBuilder.Or(leftExpression, rightExpression); break; default: throw new NotImplementedException(string.Format("Unhandled NodeType of {0} in LambdaToDbExpressionVisitor.VisitBinary", expression.NodeType)); } } MapExpressionToDbExpression(expression, dbExpression); return(expression); }