@@ -562,28 +562,7 @@ private CountOperation CreateCountOperation(FilterDefinition<TDocument> filter,
562562 private DistinctOperation < TField > CreateDistinctOperation < TField > ( FieldDefinition < TDocument , TField > field , FilterDefinition < TDocument > filter , DistinctOptions options )
563563 {
564564 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 ) ;
587566
588567 return new DistinctOperation < TField > (
589568 _collectionNamespace ,
@@ -759,6 +738,32 @@ private FindOperation<TResult> CreateMapReduceOutputToCollectionFindOperation<TR
759738 } ;
760739 }
761740
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+
762767 private TResult ExecuteReadOperation < TResult > ( IReadOperation < TResult > operation , CancellationToken cancellationToken )
763768 {
764769 return ExecuteReadOperation ( operation , _settings . ReadPreference , cancellationToken ) ;
0 commit comments