数据行映射


  数据行映射是将读取的数据映射到对象的过程,在 Fireasy 里提供了 IDataRowMapper<T> 接口。使用 ExecuteEnumerable 方法时,默认可以不需要指定映射器,它会使用 DefaultRowMapper<T> 进行映射。

  IDataRowMapper<T> 接口提供了一个 Map 方法,它用于将 IDataReader 的数据为一个对象。以下是使用反射实现的映射器(仅做示例说明):

public class ReflectionRowMapper<T> : IDataRowMapper<T>
{
    public T Map(IDataReader reader)
    {
        var obj = typeof(T).New<T>();
                
        foreach (var property in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            var index = reader.GetOrdinal(property.Name);
            if (index != -1)
            {
                var value = reader.GetValue(index);
                property.SetValue(obj, value);
            }
        }
                
        return obj;
    }
        
    public IRecordWrapper RecordWrapper { get; set; }
}

[TestMethod]
public void TestEnumerable()
{
    var sql = (SqlCommand)"select productid, productname from products";
    var mapper = new ReflectionRowMapper<Products>();
        
    using (var db = DatabaseFactory.CreateDatabase())
    {
        foreach (var item in db.ExecuteEnumerable<Products>(sql, rowMapper: mapper))
        {
            Console.WriteLine(item.ProductName);
        }
    }
}

  RecordWrapper 是 记录包装服务,ExecuteEnumerable 方法调用映射器时会自动给它赋值。使用 IDataReader 读取数据时,最好使用 RecordWrapper 包装读取。


  常见的内置数据行映射器如下:

  • SingleValueRowMapper

  • DefaultRowMapper

  • ExpressionRowMapper

  • EntityRowMapper (Fireasy.Data.Entity)