Skip to content

Commit d7ad382

Browse files
committed
Transfer duplicate code and encapsulate it as a static method
1 parent 9fcbb3b commit d7ad382

File tree

2 files changed

+15
-39
lines changed

2 files changed

+15
-39
lines changed

Dapper/SqlMapper.GridReader.Async.cs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ private Task<IEnumerable<T>> ReadAsyncImpl<T>(Type type, bool buffered)
179179
else
180180
{
181181
var result = ReadDeferred<T>(gridIndex, deserializer.Func, type);
182-
if (buffered) result = result.ToList(); // for the "not a DbDataReader" scenario
182+
if (buffered) result = result?.ToList(); // for the "not a DbDataReader" scenario
183183
return Task.FromResult(result);
184184
}
185185
}
@@ -212,18 +212,7 @@ private async Task<T> ReadRowAsyncImplViaDbReader<T>(DbDataReader reader, Type t
212212
cache.Deserializer = deserializer;
213213
}
214214

215-
object val = deserializer.Func(reader);
216-
217-
if (val != null)
218-
{
219-
if (val is T)
220-
result = (T)val;
221-
else
222-
{
223-
var convertToType = Nullable.GetUnderlyingType(type) ?? type;
224-
result = (T)Convert.ChangeType(val, convertToType, CultureInfo.InvariantCulture);
225-
}
226-
}
215+
result = ConvertTo<T>(deserializer.Func(reader));
227216

228217
if ((row & Row.Single) != 0 && await reader.ReadAsync(cancel).ConfigureAwait(false)) ThrowMultipleRows(row);
229218
while (await reader.ReadAsync(cancel).ConfigureAwait(false)) { /* ignore subsequent rows */ }

Dapper/SqlMapper.GridReader.cs

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ private IEnumerable<T> ReadImpl<T>(Type type, bool buffered)
159159
}
160160
IsConsumed = true;
161161
var result = ReadDeferred<T>(gridIndex, deserializer.Func, type);
162-
return buffered ? result.ToList() : result;
162+
return buffered ? result?.ToList() : result;
163163
}
164164

165165
private T ReadRow<T>(Type type, Row row)
@@ -181,18 +181,8 @@ private T ReadRow<T>(Type type, Row row)
181181
deserializer = new DeserializerState(hash, GetDeserializer(type, reader, 0, -1, false));
182182
cache.Deserializer = deserializer;
183183
}
184-
object val = deserializer.Func(reader);
185184

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));
196186

197187
if ((row & Row.Single) != 0 && reader.Read()) ThrowMultipleRows(row);
198188
while (reader.Read()) { /* ignore subsequent rows */ }
@@ -363,22 +353,9 @@ private IEnumerable<T> ReadDeferred<T>(int index, Func<IDataReader, object> dese
363353
{
364354
try
365355
{
366-
var convertToType = Nullable.GetUnderlyingType(effectiveType) ?? effectiveType;
367356
while (index == gridIndex && reader.Read())
368357
{
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));
382359
}
383360
}
384361
finally // finally so that First etc progresses things even when multiple rows
@@ -440,6 +417,16 @@ public void Dispose()
440417
}
441418
GC.SuppressFinalize(this);
442419
}
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+
}
443430
}
444431
}
445432
}

0 commit comments

Comments
 (0)