@@ -130,9 +130,9 @@ public override object Execute()
130
130
foreach ( var clause in _orderBy )
131
131
{
132
132
var memberExpression = ( MemberExpression ) clause . Key . Body ;
133
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
133
+ var serializationInfo = GetSerializationInfo ( memberExpression ) ;
134
134
var direction = ( clause . Direction == OrderByDirection . Descending ) ? - 1 : 1 ;
135
- sortBy . Add ( dottedElementName , direction ) ;
135
+ sortBy . Add ( serializationInfo . ElementName , direction ) ;
136
136
}
137
137
cursor . SetSortOrder ( sortBy ) ;
138
138
}
@@ -264,15 +264,15 @@ private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
264
264
var valueExpression = binaryExpression . Right as ConstantExpression ;
265
265
if ( memberExpression != null && valueExpression != null )
266
266
{
267
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
267
+ var serializationInfo = GetSerializationInfo ( memberExpression ) ;
268
268
var value = ( int ) valueExpression . Value ;
269
269
if ( binaryExpression . NodeType == ExpressionType . Equal )
270
270
{
271
- return Query . Size ( dottedElementName , value ) ;
271
+ return Query . Size ( serializationInfo . ElementName , value ) ;
272
272
}
273
273
else
274
274
{
275
- return Query . Not ( dottedElementName ) . Size ( value ) ;
275
+ return Query . Not ( serializationInfo . ElementName ) . Size ( value ) ;
276
276
}
277
277
}
278
278
}
@@ -287,15 +287,15 @@ private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
287
287
var valueExpression = binaryExpression . Right as ConstantExpression ;
288
288
if ( memberExpression != null && valueExpression != null )
289
289
{
290
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
290
+ var serializationInfo = GetSerializationInfo ( memberExpression ) ;
291
291
var value = ( int ) valueExpression . Value ;
292
292
if ( binaryExpression . NodeType == ExpressionType . Equal )
293
293
{
294
- return Query . Size ( dottedElementName , value ) ;
294
+ return Query . Size ( serializationInfo . ElementName , value ) ;
295
295
}
296
296
else
297
297
{
298
- return Query . Not ( dottedElementName ) . Size ( value ) ;
298
+ return Query . Not ( serializationInfo . ElementName ) . Size ( value ) ;
299
299
}
300
300
}
301
301
}
@@ -313,15 +313,15 @@ private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
313
313
var valueExpression = binaryExpression . Right as ConstantExpression ;
314
314
if ( memberExpression != null && valueExpression != null )
315
315
{
316
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
316
+ var serializationInfo = GetSerializationInfo ( memberExpression ) ;
317
317
var value = ( int ) valueExpression . Value ;
318
318
if ( binaryExpression . NodeType == ExpressionType . Equal )
319
319
{
320
- return Query . Size ( dottedElementName , value ) ;
320
+ return Query . Size ( serializationInfo . ElementName , value ) ;
321
321
}
322
322
else
323
323
{
324
- return Query . Not ( dottedElementName ) . Size ( value ) ;
324
+ return Query . Not ( serializationInfo . ElementName ) . Size ( value ) ;
325
325
}
326
326
}
327
327
}
@@ -331,6 +331,19 @@ private IMongoQuery BuildArrayLengthQuery(BinaryExpression binaryExpression)
331
331
return null ;
332
332
}
333
333
334
+ private IMongoQuery BuildBooleanQuery ( Expression expression )
335
+ {
336
+ if ( expression . Type == typeof ( bool ) )
337
+ {
338
+ var serializationInfo = GetSerializationInfo ( expression ) ;
339
+ if ( serializationInfo != null )
340
+ {
341
+ return new QueryDocument ( serializationInfo . ElementName , true ) ;
342
+ }
343
+ }
344
+ return null ;
345
+ }
346
+
334
347
private IMongoQuery BuildComparisonQuery ( BinaryExpression binaryExpression )
335
348
{
336
349
if ( binaryExpression . NodeType == ExpressionType . Equal || binaryExpression . NodeType == ExpressionType . NotEqual )
@@ -533,11 +546,10 @@ private IMongoQuery BuildIsMatchQuery(MethodCallExpression methodCallExpression)
533
546
{
534
547
if ( arguments . Length == 2 || arguments . Length == 3 )
535
548
{
536
- var inputExpression = arguments [ 0 ] as MemberExpression ;
549
+ var serializationInfo = GetSerializationInfo ( arguments [ 0 ] ) ;
537
550
var patternExpression = arguments [ 1 ] as ConstantExpression ;
538
- if ( inputExpression != null && patternExpression != null )
551
+ if ( serializationInfo != null && patternExpression != null )
539
552
{
540
- var dottedElementName = GetDottedElementName ( inputExpression ) ;
541
553
var pattern = patternExpression . Value as string ;
542
554
if ( pattern != null )
543
555
{
@@ -552,7 +564,7 @@ private IMongoQuery BuildIsMatchQuery(MethodCallExpression methodCallExpression)
552
564
options = ( RegexOptions ) optionsExpression . Value ;
553
565
}
554
566
var regex = new Regex ( pattern , options ) ;
555
- return Query . Matches ( dottedElementName , regex ) ;
567
+ return Query . Matches ( serializationInfo . ElementName , regex ) ;
556
568
}
557
569
}
558
570
}
@@ -562,29 +574,18 @@ private IMongoQuery BuildIsMatchQuery(MethodCallExpression methodCallExpression)
562
574
var regexExpression = obj as ConstantExpression ;
563
575
if ( regexExpression != null && arguments . Length == 1 )
564
576
{
577
+ var serializationInfo = GetSerializationInfo ( arguments [ 0 ] ) ;
565
578
var regex = regexExpression . Value as Regex ;
566
- var inputExpression = arguments [ 0 ] as MemberExpression ;
567
- if ( regex != null && inputExpression != null )
579
+ if ( serializationInfo != null && regex != null )
568
580
{
569
- var dottedElementName = GetDottedElementName ( inputExpression ) ;
570
- return Query . Matches ( dottedElementName , regex ) ;
581
+ return Query . Matches ( serializationInfo . ElementName , regex ) ;
571
582
}
572
583
}
573
584
}
574
585
}
575
586
return null ;
576
587
}
577
588
578
- private IMongoQuery BuildMemberQuery ( MemberExpression memberExpression )
579
- {
580
- if ( memberExpression . Type == typeof ( bool ) )
581
- {
582
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
583
- return new QueryDocument ( dottedElementName , true ) ;
584
- }
585
- return null ;
586
- }
587
-
588
589
private IMongoQuery BuildMethodCallQuery ( MethodCallExpression methodCallExpression )
589
590
{
590
591
switch ( methodCallExpression . Method . Name )
@@ -606,21 +607,20 @@ private IMongoQuery BuildModQuery(BinaryExpression binaryExpression)
606
607
var leftBinaryExpression = binaryExpression . Left as BinaryExpression ;
607
608
if ( leftBinaryExpression != null && leftBinaryExpression . NodeType == ExpressionType . Modulo )
608
609
{
609
- var memberExpression = leftBinaryExpression . Left as MemberExpression ;
610
+ var serializationInfo = GetSerializationInfo ( leftBinaryExpression . Left ) ;
610
611
var modulusExpression = leftBinaryExpression . Right as ConstantExpression ;
611
612
var equalsExpression = binaryExpression . Right as ConstantExpression ;
612
- if ( memberExpression != null && modulusExpression != null && equalsExpression != null )
613
+ if ( serializationInfo != null && modulusExpression != null && equalsExpression != null )
613
614
{
614
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
615
615
var modulus = Convert . ToInt32 ( modulusExpression . Value ) ;
616
616
var equals = Convert . ToInt32 ( equalsExpression . Value ) ;
617
617
if ( binaryExpression . NodeType == ExpressionType . Equal )
618
618
{
619
- return Query . Mod ( dottedElementName , modulus , equals ) ;
619
+ return Query . Mod ( serializationInfo . ElementName , modulus , equals ) ;
620
620
}
621
621
else
622
622
{
623
- return Query . Not ( dottedElementName ) . Mod ( modulus , equals ) ;
623
+ return Query . Not ( serializationInfo . ElementName ) . Mod ( modulus , equals ) ;
624
624
}
625
625
}
626
626
}
@@ -724,6 +724,9 @@ private IMongoQuery BuildQuery(Expression expression)
724
724
case ExpressionType . AndAlso :
725
725
query = BuildAndAlsoQuery ( ( BinaryExpression ) expression ) ;
726
726
break ;
727
+ case ExpressionType . ArrayIndex :
728
+ query = BuildBooleanQuery ( expression ) ;
729
+ break ;
727
730
case ExpressionType . Call :
728
731
query = BuildMethodCallQuery ( ( MethodCallExpression ) expression ) ;
729
732
break ;
@@ -739,7 +742,7 @@ private IMongoQuery BuildQuery(Expression expression)
739
742
query = BuildComparisonQuery ( ( BinaryExpression ) expression ) ;
740
743
break ;
741
744
case ExpressionType . MemberAccess :
742
- query = BuildMemberQuery ( ( MemberExpression ) expression ) ;
745
+ query = BuildBooleanQuery ( expression ) ;
743
746
break ;
744
747
case ExpressionType . Not :
745
748
query = BuildNotQuery ( ( UnaryExpression ) expression ) ;
@@ -770,11 +773,10 @@ private IMongoQuery BuildStringQuery(MethodCallExpression methodCallExpression)
770
773
var arguments = methodCallExpression . Arguments . ToArray ( ) ;
771
774
if ( arguments . Length == 1 )
772
775
{
773
- var memberExpression = methodCallExpression . Object as MemberExpression ;
776
+ var serializationInfo = GetSerializationInfo ( methodCallExpression . Object ) ;
774
777
var valueExpression = arguments [ 0 ] as ConstantExpression ;
775
- if ( memberExpression != null && valueExpression != null )
778
+ if ( serializationInfo != null && valueExpression != null )
776
779
{
777
- var dottedElementName = GetDottedElementName ( memberExpression ) ;
778
780
var s = ( string ) valueExpression . Value ;
779
781
BsonRegularExpression regex ;
780
782
switch ( methodCallExpression . Method . Name )
@@ -784,7 +786,7 @@ private IMongoQuery BuildStringQuery(MethodCallExpression methodCallExpression)
784
786
case "StartsWith" : regex = new BsonRegularExpression ( "^" + s ) ; break ;
785
787
default : throw new InvalidOperationException ( "Unreachable code" ) ;
786
788
}
787
- return Query . Matches ( dottedElementName , regex ) ;
789
+ return Query . Matches ( serializationInfo . ElementName , regex ) ;
788
790
}
789
791
}
790
792
break ;
@@ -816,12 +818,6 @@ private void CombinePredicateWithWhereClause(MethodCallExpression methodCallExpr
816
818
}
817
819
}
818
820
819
- private string GetDottedElementName ( MemberExpression memberExpression )
820
- {
821
- var serializationInfo = GetSerializationInfo ( memberExpression ) ;
822
- return serializationInfo . ElementName ;
823
- }
824
-
825
821
private BsonSerializationInfo GetSerializationInfo ( Expression expression )
826
822
{
827
823
var documentSerializer = BsonSerializer . LookupSerializer ( DocumentType ) ;
0 commit comments