@@ -238,18 +238,14 @@ private IMongoQuery BuildAnyQuery(MethodCallExpression methodCallExpression)
238
238
return null ;
239
239
}
240
240
241
- private IMongoQuery BuildArrayLengthQuery ( BinaryExpression binaryExpression )
241
+ private IMongoQuery BuildArrayLengthQuery ( Expression variableExpression , ExpressionType operatorType , ConstantExpression constantExpression )
242
242
{
243
- // the constant could be on either side (but only == and != are supported and they don't need to be flipped)
244
- var variableExpression = binaryExpression . Left ;
245
- var constantExpression = binaryExpression . Right as ConstantExpression ;
246
- if ( constantExpression == null )
243
+ if ( operatorType != ExpressionType . Equal && operatorType != ExpressionType . NotEqual )
247
244
{
248
- constantExpression = binaryExpression . Left as ConstantExpression ;
249
- variableExpression = binaryExpression . Right ;
245
+ return null ;
250
246
}
251
-
252
- if ( constantExpression == null || constantExpression . Type != typeof ( int ) )
247
+
248
+ if ( constantExpression . Type != typeof ( int ) )
253
249
{
254
250
return null ;
255
251
}
@@ -302,7 +298,7 @@ private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
302
298
303
299
if ( serializationInfo != null )
304
300
{
305
- if ( binaryExpression . NodeType == ExpressionType . Equal )
301
+ if ( operatorType == ExpressionType . Equal )
306
302
{
307
303
return Query . Size ( serializationInfo . ElementName , value ) ;
308
304
}
@@ -330,36 +326,21 @@ private IMongoQuery BuildBooleanQuery(Expression expression)
330
326
331
327
private IMongoQuery BuildComparisonQuery ( BinaryExpression binaryExpression )
332
328
{
333
- var operatorNodeType = binaryExpression . NodeType ;
334
- if ( operatorNodeType == ExpressionType . Equal || operatorNodeType == ExpressionType . NotEqual )
335
- {
336
- var query = BuildArrayLengthQuery ( binaryExpression ) ;
337
- if ( query != null )
338
- {
339
- return query ;
340
- }
341
-
342
- query = BuildModQuery ( binaryExpression ) ;
343
- if ( query != null )
344
- {
345
- return query ;
346
- }
347
- }
348
-
349
329
// the constant could be on either side
350
330
var variableExpression = binaryExpression . Left ;
351
331
var constantExpression = binaryExpression . Right as ConstantExpression ;
332
+ var operatorType = binaryExpression . NodeType ;
352
333
if ( constantExpression == null )
353
334
{
354
335
constantExpression = binaryExpression . Left as ConstantExpression ;
355
336
variableExpression = binaryExpression . Right ;
356
337
// if the constant was on the left some operators need to be flipped
357
- switch ( operatorNodeType )
338
+ switch ( operatorType )
358
339
{
359
- case ExpressionType . LessThan : operatorNodeType = ExpressionType . GreaterThan ; break ;
360
- case ExpressionType . LessThanOrEqual : operatorNodeType = ExpressionType . GreaterThanOrEqual ; break ;
361
- case ExpressionType . GreaterThan : operatorNodeType = ExpressionType . LessThan ; break ;
362
- case ExpressionType . GreaterThanOrEqual : operatorNodeType = ExpressionType . LessThanOrEqual ; break ;
340
+ case ExpressionType . LessThan : operatorType = ExpressionType . GreaterThan ; break ;
341
+ case ExpressionType . LessThanOrEqual : operatorType = ExpressionType . GreaterThanOrEqual ; break ;
342
+ case ExpressionType . GreaterThan : operatorType = ExpressionType . LessThan ; break ;
343
+ case ExpressionType . GreaterThanOrEqual : operatorType = ExpressionType . LessThanOrEqual ; break ;
363
344
}
364
345
}
365
346
@@ -368,6 +349,18 @@ private IMongoQuery BuildComparisonQuery(BinaryExpression binaryExpression)
368
349
return null ;
369
350
}
370
351
352
+ var query = BuildArrayLengthQuery ( variableExpression , operatorType , constantExpression ) ;
353
+ if ( query != null )
354
+ {
355
+ return query ;
356
+ }
357
+
358
+ query = BuildModQuery ( variableExpression , operatorType , constantExpression ) ;
359
+ if ( query != null )
360
+ {
361
+ return query ;
362
+ }
363
+
371
364
BsonSerializationInfo serializationInfo = null ;
372
365
var value = constantExpression . Value ;
373
366
@@ -389,7 +382,7 @@ private IMongoQuery BuildComparisonQuery(BinaryExpression binaryExpression)
389
382
if ( serializationInfo != null )
390
383
{
391
384
var serializedValue = SerializeValue ( serializationInfo , value ) ;
392
- switch ( operatorNodeType )
385
+ switch ( operatorType )
393
386
{
394
387
case ExpressionType . Equal : return Query . EQ ( serializationInfo . ElementName , serializedValue ) ;
395
388
case ExpressionType . GreaterThan : return Query . GT ( serializationInfo . ElementName , serializedValue ) ;
@@ -596,18 +589,14 @@ private IMongoQuery BuildMethodCallQuery(MethodCallExpression methodCallExpressi
596
589
return null ;
597
590
}
598
591
599
- private IMongoQuery BuildModQuery ( BinaryExpression binaryExpression )
592
+ private IMongoQuery BuildModQuery ( Expression variableExpression , ExpressionType operatorType , ConstantExpression constantExpression )
600
593
{
601
- // the constant could be on either side
602
- var variableExpression = binaryExpression . Left ;
603
- var constantExpression = binaryExpression . Right as ConstantExpression ;
604
- if ( constantExpression == null )
594
+ if ( operatorType != ExpressionType . Equal && operatorType != ExpressionType . NotEqual )
605
595
{
606
- constantExpression = binaryExpression . Left as ConstantExpression ;
607
- variableExpression = binaryExpression . Right ;
596
+ return null ;
608
597
}
609
598
610
- if ( constantExpression == null || constantExpression . Type != typeof ( int ) )
599
+ if ( constantExpression . Type != typeof ( int ) )
611
600
{
612
601
return null ;
613
602
}
@@ -621,7 +610,7 @@ private IMongoQuery BuildModQuery(BinaryExpression binaryExpression)
621
610
if ( serializationInfo != null && modulusExpression != null )
622
611
{
623
612
var modulus = ToInt32 ( modulusExpression ) ;
624
- if ( binaryExpression . NodeType == ExpressionType . Equal )
613
+ if ( operatorType == ExpressionType . Equal )
625
614
{
626
615
return Query . Mod ( serializationInfo . ElementName , modulus , value ) ;
627
616
}
0 commit comments