@@ -159,7 +159,7 @@ private IEnumerable<T> ReadImpl<T>(Type type, bool buffered)
159
159
}
160
160
IsConsumed = true ;
161
161
var result = ReadDeferred < T > ( gridIndex , deserializer . Func , type ) ;
162
- return buffered ? result . ToList ( ) : result ;
162
+ return buffered ? result ? . ToList ( ) : result ;
163
163
}
164
164
165
165
private T ReadRow < T > ( Type type , Row row )
@@ -181,18 +181,8 @@ private T ReadRow<T>(Type type, Row row)
181
181
deserializer = new DeserializerState ( hash , GetDeserializer ( type , reader , 0 , - 1 , false ) ) ;
182
182
cache . Deserializer = deserializer ;
183
183
}
184
- object val = deserializer . Func ( reader ) ;
185
184
186
- if ( val != null )
187
- {
188
- if ( val is T )
189
- result = ( T ) val ;
190
- else
191
- {
192
- var convertToType = Nullable . GetUnderlyingType ( type ) ?? type ;
193
- result = ( T ) Convert . ChangeType ( val , convertToType , CultureInfo . InvariantCulture ) ;
194
- }
195
- }
185
+ result = ConvertTo < T > ( deserializer . Func ( reader ) ) ;
196
186
197
187
if ( ( row & Row . Single ) != 0 && reader . Read ( ) ) ThrowMultipleRows ( row ) ;
198
188
while ( reader . Read ( ) ) { /* ignore subsequent rows */ }
@@ -363,22 +353,9 @@ private IEnumerable<T> ReadDeferred<T>(int index, Func<IDataReader, object> dese
363
353
{
364
354
try
365
355
{
366
- var convertToType = Nullable . GetUnderlyingType ( effectiveType ) ?? effectiveType ;
367
356
while ( index == gridIndex && reader . Read ( ) )
368
357
{
369
- T result = default ;
370
- object val = deserializer ( reader ) ;
371
- if ( val != null )
372
- {
373
- if ( val is T )
374
- result = ( T ) val ;
375
- else
376
- {
377
- result = ( T ) Convert . ChangeType ( val , convertToType , CultureInfo . InvariantCulture ) ;
378
- }
379
- }
380
-
381
- yield return result ;
358
+ yield return ConvertTo < T > ( deserializer ( reader ) ) ;
382
359
}
383
360
}
384
361
finally // finally so that First etc progresses things even when multiple rows
@@ -440,6 +417,16 @@ public void Dispose()
440
417
}
441
418
GC . SuppressFinalize ( this ) ;
442
419
}
420
+
421
+ private static T ConvertTo < T > ( object value )
422
+ {
423
+ if ( value is null or DBNull )
424
+ return default ;
425
+ else if ( value is T t )
426
+ return t ;
427
+ else
428
+ return ( T ) Convert . ChangeType ( value , Nullable . GetUnderlyingType ( typeof ( T ) ) ?? typeof ( T ) , CultureInfo . InvariantCulture ) ;
429
+ }
443
430
}
444
431
}
445
432
}
0 commit comments