From cbd1b889ff8489d7d426ced0bd09944f8c46e2fc Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Wed, 4 May 2011 23:44:48 +1000 Subject: [PATCH] fast expand is faster :) --- Dapper/SqlMapper.cs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/Dapper/SqlMapper.cs b/Dapper/SqlMapper.cs index ff7c280..ec30d16 100644 --- a/Dapper/SqlMapper.cs +++ b/Dapper/SqlMapper.cs @@ -155,7 +155,7 @@ public static int Execute(this IDbConnection cnn, string sql, object param = nul /// public static IEnumerable Query(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null) { - return Query(cnn, sql, param as object, transaction, buffered, commandTimeout); + return Query(cnn, sql, param as object, transaction, buffered, commandTimeout); } @@ -385,7 +385,7 @@ private static CacheInfo GetCacheInfo(object param, Identity identity) object oDeserializer; // dynamic is passed in as Object ... by c# design - if (typeof(T) == typeof(object) || typeof(T) == typeof(ExpandoObject)) + if (typeof(T) == typeof(object) || typeof(T) == typeof(FastExpando)) { oDeserializer = GetDynamicDeserializer(reader,startBound, length, returnNullIfFirstMissing); } @@ -402,6 +402,29 @@ private static CacheInfo GetCacheInfo(object param, Identity identity) return deserializer; } + private class FastExpando : DynamicObject + { + IDictionary data; + + public static FastExpando Attach(IDictionary data) + { + FastExpando expando = new FastExpando(); + expando.data = data; + return expando; + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + data[binder.Name] = value; + return true; + } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + return data.TryGetValue(binder.Name, out result); + } + } + private static object GetDynamicDeserializer(IDataRecord reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false) { if (length == -1) @@ -409,10 +432,10 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound length = reader.FieldCount - startBound; } - Func rval = + Func rval = r => { - IDictionary row = new ExpandoObject(); + IDictionary row = new Dictionary(length); for (var i = startBound; i < startBound + length; i++) { var tmp = r.GetValue(i); @@ -423,7 +446,7 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound return null; } } - return (ExpandoObject)row; + return FastExpando.Attach(row); }; return rval; -- GitLab