数据行映射
数据行映射是将读取的数据映射到对象的过程,在 Fireasy 里提供了 IDataRowMapper<T>
接口。使用 ExecuteEnumerableDefaultRowMapper<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)