Ich bin gerade dabei mir eine kleine Hilfsroutine zu schreiben, welche anhand
der Property Namen meiner Entität aus einem DbDataReader die Ergebnisse ausliest und daraufhin eine generische Liste füllt. Natürlich müssen die Propertynamen bei meiner Methode mit den Spalten der Ergebnistabelle übereinstimmen.
Funktioniert soweit auch ganz gut. Allerding ist die Performanz nicht unbedingt sonderlich zufriedenstellend.
Im direkten Vergleich schneidet das befüllen einer DataTable durch einen DbDataAdapter um einiges besser ab.
public static List<T> MapToList<T,P>(DbDataReader dbDataReader, int capacity) where T: new()
where P : T, new()
{
List<T> ReturnList = new List<T>(capacity);
PropertyInfo[] PropertyInfoArr =
typeof(T).GetProperties();
while (dbDataReader.Read()) {
T NewEntity = new P();
#region map simple types
foreach (PropertyInfo propInfo in PropertyInfoArr) {
object RowValue = null;
Type PropertyType = propInfo.PropertyType;
try {
RowValue = dbDataReader[propInfo.Name];
if(!(RowValue is DBNull))
{
if (RowValue.GetType() != PropertyType &&
!PropertyType.IsEnum &&
!PropertyType.IsAssignableFrom(RowValue.GetType())) {
if (TypeHelper.IsNullableType(PropertyType)) {
RowValue = Convert.ChangeType(RowValue, Nullable.GetUnderlyingType(PropertyType));
} else {
RowValue = Convert.ChangeType(RowValue, PropertyType);
}
}
propInfo.SetValue(NewEntity, RowValue, null);
}
} catch (IndexOutOfRangeException) {
continue;
}
}
#endregion
ReturnList.Add(NewEntity);
}
return ReturnList;
}
Hat von euch vielleicht noch jemand Ideen wie man das ganze noch optimieren könnte. Ich schau mir gerade den Quellcode der DbDataAdapter.Fill Methoden genauer an. Ist aber doch sehr schwierig anhand des Quellcodes darauf zu schließen wie der Mechanismus funktioniert.
Natürlich könnte ich einen bestehenden OR-Mapper verwenden, das ist aber gar nicht meine Intention. Ich möchte nur eine kleine Methode welche ich bei Bedarf schnell einsetzen kann.