@@ -562,28 +562,7 @@ private CountOperation CreateCountOperation(FilterDefinition<TDocument> filter,
562
562
private DistinctOperation < TField > CreateDistinctOperation < TField > ( FieldDefinition < TDocument , TField > field , FilterDefinition < TDocument > filter , DistinctOptions options )
563
563
{
564
564
var renderedField = field . Render ( _documentSerializer , _settings . SerializerRegistry ) ;
565
-
566
- IBsonSerializer < TField > valueSerializer = null ;
567
- if ( renderedField . UnderlyingSerializer != null )
568
- {
569
- IBsonArraySerializer arraySerializer ;
570
- BsonSerializationInfo itemSerializationInfo ;
571
- if ( renderedField . UnderlyingSerializer . ValueType == typeof ( TField ) )
572
- {
573
- valueSerializer = ( IBsonSerializer < TField > ) renderedField . UnderlyingSerializer ;
574
- }
575
- else if (
576
- ( arraySerializer = renderedField . UnderlyingSerializer as IBsonArraySerializer ) != null &&
577
- arraySerializer . TryGetItemSerializationInfo ( out itemSerializationInfo ) &&
578
- itemSerializationInfo . Serializer . ValueType == typeof ( TField ) )
579
- {
580
- valueSerializer = ( IBsonSerializer < TField > ) itemSerializationInfo . Serializer ;
581
- }
582
- }
583
- if ( valueSerializer == null )
584
- {
585
- valueSerializer = _settings . SerializerRegistry . GetSerializer < TField > ( ) ;
586
- }
565
+ var valueSerializer = GetValueSerializerForDistinct ( renderedField , _settings . SerializerRegistry ) ;
587
566
588
567
return new DistinctOperation < TField > (
589
568
_collectionNamespace ,
@@ -759,6 +738,32 @@ private FindOperation<TResult> CreateMapReduceOutputToCollectionFindOperation<TR
759
738
} ;
760
739
}
761
740
741
+ private IBsonSerializer < TField > GetValueSerializerForDistinct < TField > ( RenderedFieldDefinition < TField > renderedField , IBsonSerializerRegistry serializerRegistry )
742
+ {
743
+ if ( renderedField . UnderlyingSerializer != null )
744
+ {
745
+ if ( renderedField . UnderlyingSerializer . ValueType == typeof ( TField ) )
746
+ {
747
+ return ( IBsonSerializer < TField > ) renderedField . UnderlyingSerializer ;
748
+ }
749
+
750
+ var arraySerializer = renderedField . UnderlyingSerializer as IBsonArraySerializer ;
751
+ if ( arraySerializer != null )
752
+ {
753
+ BsonSerializationInfo itemSerializationInfo ;
754
+ if ( arraySerializer . TryGetItemSerializationInfo ( out itemSerializationInfo ) )
755
+ {
756
+ if ( itemSerializationInfo . Serializer . ValueType == typeof ( TField ) )
757
+ {
758
+ return ( IBsonSerializer < TField > ) itemSerializationInfo . Serializer ;
759
+ }
760
+ }
761
+ }
762
+ }
763
+
764
+ return serializerRegistry . GetSerializer < TField > ( ) ;
765
+ }
766
+
762
767
private TResult ExecuteReadOperation < TResult > ( IReadOperation < TResult > operation , CancellationToken cancellationToken )
763
768
{
764
769
return ExecuteReadOperation ( operation , _settings . ReadPreference , cancellationToken ) ;
0 commit comments