Skip to content

Commit

Permalink
Use GetValues once per row rather than GetValue each per field.
Browse files Browse the repository at this point in the history
  • Loading branch information
schotime committed Nov 23, 2016
1 parent 83b7e78 commit 26e030a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
24 changes: 13 additions & 11 deletions src/NPoco/RowMappers/PropertyMapper.cs
Expand Up @@ -42,7 +42,9 @@ public override object Map(DbDataReader dataReader, RowMapperContext context)
_mappingOntoExistingInstance = true;
}

_mapPlan(dataReader, context.Instance);
object[] values = new object[dataReader.FieldCount];
dataReader.GetValues(values);
_mapPlan(dataReader, values, context.Instance);

var result = context.Instance as IOnLoaded;
if (result != null)
Expand All @@ -53,16 +55,16 @@ public override object Map(DbDataReader dataReader, RowMapperContext context)
return context.Instance;
}

public delegate bool MapPlan(DbDataReader reader, object instance);
public delegate bool MapPlan(DbDataReader dataReader, object[] reader, object instance);

private MapPlan BuildMapPlan(DbDataReader dataReader, PocoData pocoData)
{
var plans = _groupedNames.SelectMany(x => BuildMapPlans(x, dataReader, pocoData, pocoData.Members)).ToArray();
return (reader, instance) =>
return (reader, values, instance) =>
{
foreach (MapPlan plan in plans)
{
plan(reader, instance);
plan(reader, values, instance);
}
return true;
};
Expand All @@ -89,14 +91,14 @@ private IEnumerable<MapPlan> BuildMapPlans(GroupResult<PosName> groupedName, DbD

var subPlans = groupedName.SubItems.SelectMany(x => BuildMapPlans(x, dataReader, pocoData, children)).ToArray();

yield return (reader, instance) =>
yield return (reader, values, instance) =>
{
var newObject = pocoMember.IsList ? pocoMember.Create(dataReader) : (pocoMember.GetValue(instance) ?? pocoMember.Create(dataReader));
var shouldSetNestedObject = false;
foreach (var subPlan in subPlans)
{
shouldSetNestedObject |= subPlan(reader, newObject);
shouldSetNestedObject |= subPlan(reader, values, newObject);
}
if (shouldSetNestedObject)
Expand All @@ -120,7 +122,7 @@ private IEnumerable<MapPlan> BuildMapPlans(GroupResult<PosName> groupedName, DbD
var destType = pocoMember.MemberInfoData.MemberType;
var defaultValue = MappingHelper.GetDefault(destType);
var converter = GetConverter(pocoData, pocoMember.PocoColumn, dataReader.GetFieldType(groupedName.Key.Pos), destType);
yield return (reader, instance) => MapValue(groupedName, reader, converter, instance, pocoMember.PocoColumn, defaultValue);
yield return (reader, values, instance) => MapValue(groupedName, values, converter, instance, pocoMember.PocoColumn, defaultValue);
}
}

Expand All @@ -130,12 +132,12 @@ public static bool IsEqual(string name, string value)
|| string.Equals(value, name.Replace("_", ""), StringComparison.OrdinalIgnoreCase);
}

private bool MapValue(GroupResult<PosName> posName, DbDataReader reader, Func<object, object> converter, object instance, PocoColumn pocoColumn, object defaultValue)
private bool MapValue(GroupResult<PosName> posName, object[] values, Func<object, object> converter, object instance, PocoColumn pocoColumn, object defaultValue)
{
if (!reader.IsDBNull(posName.Key.Pos))
var value = values[posName.Key.Pos];
if (!Equals(value, DBNull.Value))
{
var value = converter != null ? converter(reader.GetValue(posName.Key.Pos)) : reader.GetValue(posName.Key.Pos);
pocoColumn.SetValue(instance, value);
pocoColumn.SetValue(instance, converter != null ? converter(value) : value);
return true;
}

Expand Down
10 changes: 8 additions & 2 deletions test/NPoco.Tests/NewMapper/FakeReader.cs
Expand Up @@ -94,7 +94,13 @@ public override string GetName(int i)

public override int GetValues(object[] values)
{
throw new NotImplementedException();
values[0] = "Name";
values[1] = 5;
values[2] = 23m;
values[3] = "AUD";
values[4] = 24m;
values[5] = "USD";
return 1;
}

public override int GetOrdinal(string name)
Expand Down Expand Up @@ -170,7 +176,7 @@ public override bool IsDBNull(int i)
return false;
}

public override int FieldCount { get { return 4; } }
public override int FieldCount { get { return 6; } }

public override object this[int ordinal]
{
Expand Down

0 comments on commit 26e030a

Please sign in to comment.