2011-04-14 52 views
0

此代码看起来应该起作用,实际上它编译并运行。但是,cmd.ExecuetReader()(以及有记录)的记录未按预期添加到dt。任何人都可以看到可能丢失的东西没有记录添加到Linq中的DataTable从DbCommand.ExecuteReader中选择

DataTable dt = new DataTable(); 
cmd.Connection.Open(); 
cmd.ExecuteReader().Cast<DbDataRecord>().Cast<DataRow>().Select(r=>dt.Rows.Add(r.ItemArray)); 

或者说,有没有这样做,当然是使用LINQ :)

回答

0

的LINQ是懒惰的一种更直接的方式。它只是在您实际访问数据时才会执行。

这可能会实现:

cmd.Connection.Open(); 
var data = cmd.ExecuteReader().Cast<DbDataRecord>().Cast<DataRow>().Select(r=>r.ItemArray).ToList(); 

DataTable dt = new DataTable(); 

foreach(var d in data) 
    dt.Rows.Add(d); 

调用ToList()力量LINQ执行

+0

感谢。其实刚刚发现这个演员:Cast ()。演员()在运行时抛出一个异常。所以这不起作用。需要另一种方法。但是当linq应该能够做到这一点时,我讨厌做读者的愚蠢迭代。 – user259286 2011-04-14 03:37:44

+0

下面是答案,非linq答案。 DataTable dt = new DataTable(); cmd.Connection.Open(); var x = cmd.ExecuteReader(); dt.Load(x,LoadOption.OverwriteChanges); – user259286 2011-04-14 03:52:58

+0

好。我正在研究一种将行集合添加到DataTable的方式,因为我对它们不是很友好。他们通常导致糟糕的OO设计。 – Andre 2011-04-14 04:01:09