我有一个返回数据表的数据层选择方法.它是从业务层方法调用的,然后应该返回强类型的通用List.
我想做的是非常相似(但不一样)这个问题:
如何将DataTable转换为通用列表?
有什么不同之处在于我希望列表包含强类型对象而不是数据行(同样,我还没有这里可用的linq).
我很关心表现.然后将从表示层调用业务层方法,并且将迭代结果以显示给用户.在业务层添加额外的迭代似乎非常浪费,只能立即再次进行演示,所以我希望尽可能快.
这是一个常见的任务,所以我真的在寻找一个可以反复重复的好模式.
上面的示例问题是它非常慢.我有一个大约有400行的DataTable,这个转换需要5到6秒!
这似乎是一项非常常见的任务,所以我很惊讶没有在这里看到有更高效的解决方案.
*更新!!* 只是为了踢,我想我会尝试使用LINQ进行转换,而不是迭代DataTable并添加到我的List.以下是我的所作所为:
ListreturnList = new List (); 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();
第一种方法(遍历每一行)花了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); } Listdata = new List (table.Rows.Count); foreach (DataRow row in table.Rows) { data.Add(new MyType((int)row[0], (string)row[1])); }
(以上问题可能引导正确的方法......)