Skip to content

Commit 8f540e7

Browse files
committed
- caching properties on DataRowMapper
1 parent ef00e3d commit 8f540e7

4 files changed

Lines changed: 34 additions & 35 deletions

File tree

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright (c) 2018, Eben Roux
1+
Copyright (c) 2019, Eben Roux
22
All rights reserved.
33

44
Redistribution and use in source and binary forms, with or without modification,

Shuttle.Core.Data.Tests/DefaultDbProviderFactories.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

Shuttle.Core.Data/DataRowMapper.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,41 @@
22
using System.Collections.Generic;
33
using System.Data;
44
using System.Linq;
5+
using System.Reflection;
56
using Shuttle.Core.Contract;
67

78
namespace Shuttle.Core.Data
89
{
910
public class DataRowMapper : IDataRowMapper
1011
{
12+
private readonly object _lock = new object();
13+
private readonly Dictionary<Type, PropertyInfo[]> _properties = new Dictionary<Type, PropertyInfo[]>();
14+
1115
public MappedRow<T> MapRow<T>(DataRow row) where T : new()
1216
{
1317
Guard.AgainstNull(row, nameof(row));
1418

15-
return new MappedRow<T>(row, Map<T>(row));
19+
return new MappedRow<T>(row, Map<T>(GetPropertyInfo<T>(), row));
1620
}
1721

1822
public IEnumerable<MappedRow<T>> MapRows<T>(IEnumerable<DataRow> rows) where T : new()
1923
{
20-
return rows?.Select(row => new MappedRow<T>(row, Map<T>(row))).ToList() ?? new List<MappedRow<T>>();
24+
var properties = GetPropertyInfo<T>();
25+
26+
return rows?.Select(row => new MappedRow<T>(row, Map<T>(properties, row))).ToList() ??
27+
new List<MappedRow<T>>();
2128
}
2229

2330
public T MapObject<T>(DataRow row) where T : new()
2431
{
25-
return Map<T>(row);
32+
return Map<T>(GetPropertyInfo<T>(), row);
2633
}
2734

2835
public IEnumerable<T> MapObjects<T>(IEnumerable<DataRow> rows) where T : new()
2936
{
30-
return rows?.Select(Map<T>).ToList() ?? new List<T>();
37+
var properties = GetPropertyInfo<T>();
38+
39+
return rows?.Select(row => Map<T>(properties, row)).ToList() ?? new List<T>();
3140
}
3241

3342
public T MapValue<T>(DataRow row)
@@ -40,17 +49,31 @@ public IEnumerable<T> MapValues<T>(IEnumerable<DataRow> rows)
4049
return rows?.Select(MapRowValue<T>).ToList() ?? new List<T>();
4150
}
4251

43-
private T Map<T>(DataRow row) where T : new()
52+
private PropertyInfo[] GetPropertyInfo<T>()
53+
{
54+
lock (_lock)
55+
{
56+
var type = typeof(T);
57+
58+
if (!_properties.ContainsKey(type))
59+
{
60+
_properties.Add(type, type.GetProperties());
61+
}
62+
63+
return _properties[type];
64+
}
65+
}
66+
67+
private T Map<T>(PropertyInfo[] properties, DataRow row) where T : new()
4468
{
4569
if (row == null)
4670
{
4771
return default(T);
4872
}
4973

5074
var result = new T();
51-
var type = typeof(T);
5275

53-
foreach (var pi in type.GetProperties())
76+
foreach (var pi in properties)
5477
{
5578
try
5679
{
@@ -78,7 +101,7 @@ private static T MapRowValue<T>(DataRow row)
78101

79102
return row?[0] == null
80103
? default(T)
81-
: (T)Convert.ChangeType(row[0], underlyingSystemType);
104+
: (T) Convert.ChangeType(row[0], underlyingSystemType);
82105
}
83106
}
84107
}

Shuttle.Core.Data/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
[assembly: AssemblyTitle(".NET Standard 2.0")]
1414
#endif
1515

16-
[assembly: AssemblyVersion("11.0.2.0")]
16+
[assembly: AssemblyVersion("11.0.3.0")]
1717
[assembly: AssemblyCopyright("Copyright © Eben Roux 2019")]
1818
[assembly: AssemblyProduct("Shuttle.Core.Data")]
1919
[assembly: AssemblyCompany("Shuttle")]
2020
[assembly: AssemblyConfiguration("Release")]
21-
[assembly: AssemblyInformationalVersion("11.0.2")]
21+
[assembly: AssemblyInformationalVersion("11.0.3")]
2222
[assembly: ComVisible(false)]

0 commit comments

Comments
 (0)