@@ -598,26 +598,40 @@ private IMongoQuery BuildMethodCallQuery(MethodCallExpression methodCallExpressi
598
598
599
599
private IMongoQuery BuildModQuery ( BinaryExpression binaryExpression )
600
600
{
601
- var leftBinaryExpression = binaryExpression . Left as BinaryExpression ;
602
- if ( leftBinaryExpression != null && leftBinaryExpression . NodeType == ExpressionType . Modulo )
601
+ // the constant could be on either side
602
+ var variableExpression = binaryExpression . Left ;
603
+ var constantExpression = binaryExpression . Right as ConstantExpression ;
604
+ if ( constantExpression == null )
605
+ {
606
+ constantExpression = binaryExpression . Left as ConstantExpression ;
607
+ variableExpression = binaryExpression . Right ;
608
+ }
609
+
610
+ if ( constantExpression == null || constantExpression . Type != typeof ( int ) )
611
+ {
612
+ return null ;
613
+ }
614
+ var value = ToInt32 ( constantExpression ) ;
615
+
616
+ var modBinaryExpression = variableExpression as BinaryExpression ;
617
+ if ( modBinaryExpression != null && modBinaryExpression . NodeType == ExpressionType . Modulo )
603
618
{
604
- var serializationInfo = GetSerializationInfo ( leftBinaryExpression . Left ) ;
605
- var modulusExpression = leftBinaryExpression . Right as ConstantExpression ;
606
- var equalsExpression = binaryExpression . Right as ConstantExpression ;
607
- if ( serializationInfo != null && modulusExpression != null && equalsExpression != null )
619
+ var serializationInfo = GetSerializationInfo ( modBinaryExpression . Left ) ;
620
+ var modulusExpression = modBinaryExpression . Right as ConstantExpression ;
621
+ if ( serializationInfo != null && modulusExpression != null )
608
622
{
609
- var modulus = Convert . ToInt32 ( modulusExpression . Value ) ;
610
- var equals = Convert . ToInt32 ( equalsExpression . Value ) ;
623
+ var modulus = ToInt32 ( modulusExpression ) ;
611
624
if ( binaryExpression . NodeType == ExpressionType . Equal )
612
625
{
613
- return Query . Mod ( serializationInfo . ElementName , modulus , equals ) ;
626
+ return Query . Mod ( serializationInfo . ElementName , modulus , value ) ;
614
627
}
615
628
else
616
629
{
617
- return Query . Not ( serializationInfo . ElementName ) . Mod ( modulus , equals ) ;
630
+ return Query . Not ( serializationInfo . ElementName ) . Mod ( modulus , value ) ;
618
631
}
619
632
}
620
633
}
634
+
621
635
return null ;
622
636
}
623
637
@@ -1000,7 +1014,7 @@ private int ToInt32(Expression expression)
1000
1014
throw new ArgumentOutOfRangeException ( "expression" , "Expected a ConstantExpression." ) ;
1001
1015
}
1002
1016
1003
- return ( int ) constantExpression . Value ;
1017
+ return ( int ) constantExpression . Value ;
1004
1018
}
1005
1019
1006
1020
private void TranslateAny ( MethodCallExpression methodCallExpression )
0 commit comments