如何使用泛型将DataReader对象映射到类对象?
例如,我需要执行以下操作:
public class Mapper<T>
{
public static List<T> MapObject(IDataReader dr)
{
List<T> objects = new List<T>();
while (dr.Read())
{
//Mapping goes here...
}
return objects;
}
}
Run Code Online (Sandbox Code Playgroud)
后来我需要调用这个类方法,如下所示:
IDataReder dataReader = DBUtil.Fetchdata("SELECT * FROM Book");
List<Book> bookList = Mapper<Book>.MapObject(dataReder);
foreach (Book b in bookList)
{
Console.WriteLine(b.ID + ", " + b.BookName);
}
Run Code Online (Sandbox Code Playgroud)
注意,Mapper - 类应该能够映射由T表示的任何类型的对象.
前言:
我正在将DbDataReader映射到实体并具有一些基准:
[0] retrieved 159180 records in 45135 ms
[1] retrieved 159180 records in 45008 ms
[2] retrieved 159180 records in 44814 ms
[3] retrieved 159180 records in 44987 ms
[4] retrieved 159180 records in 44914 ms
[5] retrieved 159180 records in 45224 ms
[6] retrieved 159180 records in 45829 ms
[7] retrieved 159180 records in 60762 ms
[8] retrieved 159180 records in 52128 ms
[9] retrieved 159180 records in 47982 ms
Run Code Online (Sandbox Code Playgroud)
考虑到从Sql Server Management Studio查询只需要17秒,这是一个非常大的时间和极差.我的选择声明:
"SELECT*FROM tbl_MyTable" …
我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。
这是映射器类:
// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
try
{
// initialize our returnable list
List<T> list = new List<T>();
// fire up the lamda mapping
var converter = new Converter<T>();
while (dr.Read())
{
// read in each row, and properly map it to our T object
var obj = converter.CreateItemFromRow(dr);
// add it to our list
list.Add(obj);
}
// reutrn it
return list;
} …
Run Code Online (Sandbox Code Playgroud) c# reflection expression-trees dbdatareader linq-expressions