Commit cbd1b889 authored by Sam Saffron's avatar Sam Saffron

fast expand is faster :)

parent 44d9698c
...@@ -155,7 +155,7 @@ public static int Execute(this IDbConnection cnn, string sql, object param = nul ...@@ -155,7 +155,7 @@ public static int Execute(this IDbConnection cnn, string sql, object param = nul
/// </summary> /// </summary>
public static IEnumerable<dynamic> Query(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null) public static IEnumerable<dynamic> Query(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null)
{ {
return Query<ExpandoObject>(cnn, sql, param as object, transaction, buffered, commandTimeout); return Query<FastExpando>(cnn, sql, param as object, transaction, buffered, commandTimeout);
} }
...@@ -385,7 +385,7 @@ private static CacheInfo GetCacheInfo(object param, Identity identity) ...@@ -385,7 +385,7 @@ private static CacheInfo GetCacheInfo(object param, Identity identity)
object oDeserializer; object oDeserializer;
// dynamic is passed in as Object ... by c# design // 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); oDeserializer = GetDynamicDeserializer(reader,startBound, length, returnNullIfFirstMissing);
} }
...@@ -402,6 +402,29 @@ private static CacheInfo GetCacheInfo(object param, Identity identity) ...@@ -402,6 +402,29 @@ private static CacheInfo GetCacheInfo(object param, Identity identity)
return deserializer; return deserializer;
} }
private class FastExpando : DynamicObject
{
IDictionary<string, object> data;
public static FastExpando Attach(IDictionary<string, object> 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) private static object GetDynamicDeserializer(IDataRecord reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false)
{ {
if (length == -1) if (length == -1)
...@@ -409,10 +432,10 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound ...@@ -409,10 +432,10 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound
length = reader.FieldCount - startBound; length = reader.FieldCount - startBound;
} }
Func<IDataReader, ExpandoObject> rval = Func<IDataReader, FastExpando> rval =
r => r =>
{ {
IDictionary<string, object> row = new ExpandoObject(); IDictionary<string, object> row = new Dictionary<string,object>(length);
for (var i = startBound; i < startBound + length; i++) for (var i = startBound; i < startBound + length; i++)
{ {
var tmp = r.GetValue(i); var tmp = r.GetValue(i);
...@@ -423,7 +446,7 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound ...@@ -423,7 +446,7 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound
return null; return null;
} }
} }
return (ExpandoObject)row; return FastExpando.Attach(row);
}; };
return rval; return rval;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment