提交 cbd1b889 编写于 作者: S Sam Saffron

fast expand is faster :)

上级 44d9698c
......@@ -155,7 +155,7 @@ public static int Execute(this IDbConnection cnn, string sql, object param = nul
/// </summary>
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)
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<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)
{
if (length == -1)
......@@ -409,10 +432,10 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound
length = reader.FieldCount - startBound;
}
Func<IDataReader, ExpandoObject> rval =
Func<IDataReader, FastExpando> rval =
r =>
{
IDictionary<string, object> row = new ExpandoObject();
IDictionary<string, object> row = new Dictionary<string,object>(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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册