Fastest way to map result of SqlDataReader to object

后端 未结 11 1091
花落未央
花落未央 2021-02-04 08:49

I\'m comparing materialize time between Dapper and ADO.NET and Dapper. Ultimately, Dapper tend to faster than ADO.NET, though the first time a given fetch query was executed

11条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-04 08:59

    This is based on the other answers but I used standard reflection to read the properties of the class you want to instantiate and fill it from the dataReader. You could also store the properties using a dictionary persisted b/w reads.

    Initialize a dictionary containing the properties from the type with their names as the keys.

    var type = typeof(Foo);
    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
    var propertyDictionary = new Dictionary();
    foreach(var property in properties)
    {
        if (!property.CanWrite) continue;
        propertyDictionary.Add(property.Name, property);
    }
    

    The method to set a new instance of the type from the DataReader would be like:

    var foo = new Foo();
    //retrieve the propertyDictionary for the type
    for (var i = 0; i < dataReader.FieldCount; i++)
    {
        var n = dataReader.GetName(i);
        PropertyInfo prop;
        if (!propertyDictionary.TryGetValue(n, out prop)) continue;
        var val = dataReader.IsDBNull(i) ? null : dataReader.GetValue(i);
        prop.SetValue(foo, val, null);
    }
    return foo;
    

    If you want to write an efficient generic class dealing with multiple types you could store each dictionary in a global dictionary>.

提交回复
热议问题