Skip to content

Commit 706bdd6

Browse files
committed
Handle implicit bools in children of .Where() also
1 parent fca7e29 commit 706bdd6

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

src/CouchDB.Driver/ExpressionVisitors/BoolMemberToConstantEvaluator.cs

+17-11
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,31 @@
44

55
namespace CouchDB.Driver.CompositeExpressionsEvaluator
66
{
7-
internal class BoolMemberToConstantEvaluator : ExpressionVisitor
7+
internal class BoolMemberToConstantEvaluator : ExpressionVisitor
88
{
9-
private bool _visitingWhereMethod;
9+
private bool _isVisitingWhereMethodOrChild;
1010

1111
protected override Expression VisitMethodCall(MethodCallExpression m)
1212
{
13-
_visitingWhereMethod = m.Method.Name == nameof(Queryable.Where) && m.Method.DeclaringType == typeof(Queryable);
14-
if (_visitingWhereMethod)
13+
bool isRootWhereMethod = !_isVisitingWhereMethodOrChild && m.Method.Name == nameof(Queryable.Where) && m.Method.DeclaringType == typeof(Queryable);
14+
if (isRootWhereMethod)
1515
{
16-
Expression result = base.VisitMethodCall(m);
17-
_visitingWhereMethod = false;
18-
return result;
16+
_isVisitingWhereMethodOrChild = true;
1917
}
20-
return base.VisitMethodCall(m);
18+
19+
Expression result = base.VisitMethodCall(m);
20+
21+
if (isRootWhereMethod)
22+
{
23+
_isVisitingWhereMethodOrChild = false;
24+
}
25+
26+
return result;
2127
}
2228

2329
protected override Expression VisitBinary(BinaryExpression expression)
2430
{
25-
if (_visitingWhereMethod && expression.Right is ConstantExpression c && c.Type == typeof(bool) &&
31+
if (_isVisitingWhereMethodOrChild && expression.Right is ConstantExpression c && c.Type == typeof(bool) &&
2632
(expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual))
2733
{
2834
return expression;
@@ -50,8 +56,8 @@ protected override Expression VisitUnary(UnaryExpression expression)
5056

5157
private bool IsWhereBooleanExpression(MemberExpression expression)
5258
{
53-
return _visitingWhereMethod &&
54-
expression.Member is PropertyInfo info &&
59+
return _isVisitingWhereMethodOrChild &&
60+
expression.Member is PropertyInfo info &&
5561
info.PropertyType == typeof(bool);
5662
}
5763
}

0 commit comments

Comments
 (0)