@@ -750,11 +750,14 @@ private FilterDefinition<BsonDocument> TranslateOr(BinaryExpression binaryExpres
750
750
751
751
private FilterDefinition < BsonDocument > TranslatePipeline ( PipelineExpression node )
752
752
{
753
+ if ( node . ResultOperator is AllResultOperator )
754
+ {
755
+ return TranslatePipelineAll ( node ) ;
756
+ }
753
757
if ( node . ResultOperator is AnyResultOperator )
754
758
{
755
759
return TranslatePipelineAny ( node ) ;
756
760
}
757
-
758
761
if ( node . ResultOperator is ContainsResultOperator )
759
762
{
760
763
return TranslatePipelineContains ( node ) ;
@@ -763,6 +766,48 @@ private FilterDefinition<BsonDocument> TranslatePipeline(PipelineExpression node
763
766
return null ;
764
767
}
765
768
769
+ private FilterDefinition < BsonDocument > TranslatePipelineAll ( PipelineExpression node )
770
+ {
771
+ var whereExpression = node . Source as WhereExpression ;
772
+ if ( whereExpression == null )
773
+ {
774
+ return null ;
775
+ }
776
+
777
+ var constant = whereExpression . Source as ConstantExpression ;
778
+ if ( constant == null )
779
+ {
780
+ return null ;
781
+ }
782
+
783
+ var embeddedPipeline = whereExpression . Predicate as PipelineExpression ;
784
+ if ( ! ( embeddedPipeline ? . ResultOperator is ContainsResultOperator ) )
785
+ {
786
+ return null ;
787
+ }
788
+
789
+ var fieldExpression = embeddedPipeline . Source as IFieldExpression ;
790
+ if ( fieldExpression == null )
791
+ {
792
+ return null ;
793
+ }
794
+
795
+ var arraySerializer = fieldExpression . Serializer as IBsonArraySerializer ;
796
+ if ( arraySerializer == null )
797
+ {
798
+ return null ;
799
+ }
800
+
801
+ BsonSerializationInfo itemSerializationInfo ;
802
+ if ( ! arraySerializer . TryGetItemSerializationInfo ( out itemSerializationInfo ) )
803
+ {
804
+ return null ;
805
+ }
806
+
807
+ var serializedValues = itemSerializationInfo . SerializeValues ( ( IEnumerable ) constant . Value ) ;
808
+ return __builder . All ( fieldExpression . FieldName , serializedValues ) ;
809
+ }
810
+
766
811
private FilterDefinition < BsonDocument > TranslatePipelineAny ( PipelineExpression node )
767
812
{
768
813
var fieldExpression = node . Source as IFieldExpression ;
@@ -773,7 +818,6 @@ private FilterDefinition<BsonDocument> TranslatePipelineAny(PipelineExpression n
773
818
__builder . Not ( __builder . Size ( fieldExpression . FieldName , 0 ) ) ) ;
774
819
}
775
820
776
-
777
821
var whereExpression = node . Source as WhereExpression ;
778
822
if ( whereExpression == null )
779
823
{
@@ -783,6 +827,10 @@ private FilterDefinition<BsonDocument> TranslatePipelineAny(PipelineExpression n
783
827
fieldExpression = whereExpression . Source as IFieldExpression ;
784
828
if ( fieldExpression == null )
785
829
{
830
+ if ( whereExpression . Source is ConstantExpression )
831
+ {
832
+ return TranslatePipelineAnyScalar ( node ) ;
833
+ }
786
834
return null ;
787
835
}
788
836
@@ -807,6 +855,48 @@ private FilterDefinition<BsonDocument> TranslatePipelineAny(PipelineExpression n
807
855
return filter ;
808
856
}
809
857
858
+ private FilterDefinition < BsonDocument > TranslatePipelineAnyScalar ( PipelineExpression node )
859
+ {
860
+ var whereExpression = node . Source as WhereExpression ;
861
+ if ( whereExpression == null )
862
+ {
863
+ return null ;
864
+ }
865
+
866
+ var constant = whereExpression . Source as ConstantExpression ;
867
+ if ( constant == null )
868
+ {
869
+ return null ;
870
+ }
871
+
872
+ var embeddedPipeline = whereExpression . Predicate as PipelineExpression ;
873
+ if ( ! ( embeddedPipeline ? . ResultOperator is ContainsResultOperator ) )
874
+ {
875
+ return null ;
876
+ }
877
+
878
+ var fieldExpression = embeddedPipeline . Source as IFieldExpression ;
879
+ if ( fieldExpression == null )
880
+ {
881
+ return null ;
882
+ }
883
+
884
+ var arraySerializer = fieldExpression . Serializer as IBsonArraySerializer ;
885
+ if ( arraySerializer == null )
886
+ {
887
+ return null ;
888
+ }
889
+
890
+ BsonSerializationInfo itemSerializationInfo ;
891
+ if ( ! arraySerializer . TryGetItemSerializationInfo ( out itemSerializationInfo ) )
892
+ {
893
+ return null ;
894
+ }
895
+
896
+ var serializedValues = itemSerializationInfo . SerializeValues ( ( IEnumerable ) constant . Value ) ;
897
+ return __builder . In ( fieldExpression . FieldName , serializedValues ) ;
898
+ }
899
+
810
900
private FilterDefinition < BsonDocument > TranslatePipelineContains ( PipelineExpression node )
811
901
{
812
902
var value = ( ( ContainsResultOperator ) node . ResultOperator ) . Value ;
0 commit comments