Fastest way to map result of SqlDataReader to object

后端 未结 11 1261
花落未央
花落未央 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条回答
  •  萌比男神i
    2021-02-04 08:53

    Took the method from pimbrouwers' answer and optimized it slightly. Reduce LINQ calls.

    Maps only properties found in both the object and data field names. Handles DBNull. Other assumption made is your domain model properties absolutely equals table column/field names.

    /// 
    /// Maps a SqlDataReader record to an object.
    /// 
    /// 
    /// 
    /// 
    public static void MapDataToObject(this SqlDataReader dataReader, T newObject)
    {
        if (newObject == null) throw new ArgumentNullException(nameof(newObject));
    
        // Fast Member Usage
        var objectMemberAccessor = TypeAccessor.Create(newObject.GetType());
        var propertiesHashSet =
                objectMemberAccessor
                .GetMembers()
                .Select(mp => mp.Name)
                .ToHashSet();
    
        for (int i = 0; i < dataReader.FieldCount; i++)
        {
            if (propertiesHashSet.Contains(dataReader.GetName(i)))
            {
                objectMemberAccessor[newObject, dataReader.GetName(i)]
                    = dataReader.IsDBNull(i) ? null : dataReader.GetValue(i);
            }
        }
    }
    

    Sample Usage:

    public async Task GetAsync(string storedProcedureName, SqlParameter[] sqlParameters = null) where T : class, new()
    {
        using (var conn = new SqlConnection(_connString))
        {
            var sqlCommand = await GetSqlCommandAsync(storedProcedureName, conn, sqlParameters);
            var dataReader = await sqlCommand.ExecuteReaderAsync(CommandBehavior.CloseConnection);
    
            if (dataReader.HasRows)
            {
                var newObject = new T();
    
                if (await dataReader.ReadAsync())
                { dataReader.MapDataToObject(newObject); }
    
                return newObject;
            }
            else
            { return null; }
        }
    }
    

提交回复
热议问题