Joe*_*orn 4 .net datatable n-tier-architecture .net-2.0
我有一个返回数据表的数据层选择方法.它是从业务层方法调用的,然后应该返回强类型的通用List.
我想做的是非常相似(但不一样)这个问题:
如何将DataTable转换为通用列表?
有什么不同之处在于我希望列表包含强类型对象而不是数据行(同样,我还没有这里可用的linq).
我很关心表现.然后将从表示层调用业务层方法,并且将迭代结果以显示给用户.在业务层添加额外的迭代似乎非常浪费,只能立即再次进行演示,所以我希望尽可能快.
这是一个常见的任务,所以我真的在寻找一个可以反复重复的好模式.
上面的示例问题是它非常慢.我有一个大约有400行的DataTable,这个转换需要5到6秒!
这似乎是一项非常常见的任务,所以我很惊讶没有在这里看到有更高效的解决方案.
*更新!!* 只是为了踢,我想我会尝试使用LINQ进行转换,而不是迭代DataTable并添加到我的List.以下是我的所作所为:
List<MyObject> returnList = new List<MyObject>();
MyDataTable dtMyData = new MyTableAdapter().GetMyData();
returnLists = (from l in dtMyData
select new MyObject
{
Active = l.IsActive,
Email = l.Email,
//...
//About 40 more properties
//...
ZipCode = l.Zipcode
}).ToList();
Run Code Online (Sandbox Code Playgroud)
第一种方法(遍历每一行)花了5.3秒,使用LINQ的方法耗时1.8秒!
您是否DataTable提前了解了打字对象的结构?您可以使用委托来执行映射.如果你不这样做(即你所知道的只是一个Type和属性),有很多方法可以加速动态成员访问(例如HyperDescriptor).
无论哪种方式,考虑一个迭代器块; 这样你不必第二次缓冲对象; 当然,如果你只处理小行数,这不是问题.
你能澄清其中的任何一点吗?我可以添加更多细节......
最简单的,有什么问题:
DataTable table = new DataTable {
Columns = {
{"Foo", typeof(int)},
{"Bar", typeof(string)}
}
};
for (int i = 0; i < 5000; i++) {
table.Rows.Add(i, "Row " + i);
}
List<MyType> data = new List<MyType>(table.Rows.Count);
foreach (DataRow row in table.Rows) {
data.Add(new MyType((int)row[0], (string)row[1]));
}
Run Code Online (Sandbox Code Playgroud)
(以上问题可能引导正确的方法......)
| 归档时间: |
|
| 查看次数: |
29015 次 |
| 最近记录: |