Skip to content

Commit acc1503

Browse files
rstamcraiggwilson
authored andcommitted
PULL-120: Changed the new support for & and | in LINQ queries to check that the parameters to & and | are of type bool.
1 parent cf219a7 commit acc1503

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

Driver/Linq/Translators/PredicateTranslator.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,11 @@ public IMongoQuery BuildQuery(Expression expression)
6161
switch (expression.NodeType)
6262
{
6363
case ExpressionType.And:
64-
case ExpressionType.AndAlso:
6564
query = BuildAndQuery((BinaryExpression)expression);
6665
break;
66+
case ExpressionType.AndAlso:
67+
query = BuildAndAlsoQuery((BinaryExpression)expression);
68+
break;
6769
case ExpressionType.ArrayIndex:
6870
query = BuildBooleanQuery(expression);
6971
break;
@@ -88,9 +90,11 @@ public IMongoQuery BuildQuery(Expression expression)
8890
query = BuildNotQuery((UnaryExpression)expression);
8991
break;
9092
case ExpressionType.Or:
91-
case ExpressionType.OrElse:
9293
query = BuildOrQuery((BinaryExpression)expression);
9394
break;
95+
case ExpressionType.OrElse:
96+
query = BuildOrElseQuery((BinaryExpression)expression);
97+
break;
9498
case ExpressionType.TypeIs:
9599
query = BuildTypeIsQuery((TypeBinaryExpression)expression);
96100
break;
@@ -106,11 +110,21 @@ public IMongoQuery BuildQuery(Expression expression)
106110
}
107111

108112
// private methods
109-
private IMongoQuery BuildAndQuery(BinaryExpression binaryExpression)
113+
private IMongoQuery BuildAndAlsoQuery(BinaryExpression binaryExpression)
110114
{
111115
return Query.And(BuildQuery(binaryExpression.Left), BuildQuery(binaryExpression.Right));
112116
}
113117

118+
private IMongoQuery BuildAndQuery(BinaryExpression binaryExpression)
119+
{
120+
if (binaryExpression.Left.Type == typeof(bool) && binaryExpression.Right.Type == typeof(bool))
121+
{
122+
return BuildAndAlsoQuery(binaryExpression);
123+
}
124+
125+
return null;
126+
}
127+
114128
private IMongoQuery BuildAnyQuery(MethodCallExpression methodCallExpression)
115129
{
116130
if (methodCallExpression.Method.DeclaringType == typeof(Enumerable))
@@ -775,11 +789,21 @@ private IMongoQuery BuildNotQuery(UnaryExpression unaryExpression)
775789
return Query.Not(queryDocument);
776790
}
777791

778-
private IMongoQuery BuildOrQuery(BinaryExpression binaryExpression)
792+
private IMongoQuery BuildOrElseQuery(BinaryExpression binaryExpression)
779793
{
780794
return Query.Or(BuildQuery(binaryExpression.Left), BuildQuery(binaryExpression.Right));
781795
}
782796

797+
private IMongoQuery BuildOrQuery(BinaryExpression binaryExpression)
798+
{
799+
if (binaryExpression.Left.Type == typeof(bool) && binaryExpression.Right.Type == typeof(bool))
800+
{
801+
return BuildOrElseQuery(binaryExpression);
802+
}
803+
804+
return null;
805+
}
806+
783807
private IMongoQuery BuildStringIndexOfQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)
784808
{
785809
// TODO: support other comparison operators

0 commit comments

Comments
 (0)