从 DbCommand.ExecuteReader 中的 Linq 选择中没有记录添加到 DataTable

Posted

技术标签:

【中文标题】从 DbCommand.ExecuteReader 中的 Linq 选择中没有记录添加到 DataTable【英文标题】:No records are added to DataTable in Linq Select from DbCommand.ExecuteReader 【发布时间】:2011-04-14 03:18:58 【问题描述】:

这段代码看起来应该可以工作,实际上它可以编译并运行。但是,cmd.ExecuetReader() 中的记录(并且有记录)并未按预期添加到dt。有人知道可能缺少什么吗?

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

或者,有没有更直接的方法,当然使用 linq :)

【问题讨论】:

【参考方案1】:

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 执行

【讨论】:

谢谢。实际上刚刚发现这种转换: Cast().Cast() 在运行时抛出异常。所以这行不通。需要另一种方法。但是当 linq 应该能够做到这一点时,我不想做读者的愚蠢迭代。 这是答案,非 linq 答案。数据表 dt = 新数据表(); cmd.Connection.Open(); var x = cmd.ExecuteReader(); dt.Load(x, LoadOption.OverwriteChanges); 好。我正在寻找一种向 DataTable 添加行集合的方法,因为我对它们不是很友好。它们通常会导致糟糕的 OO 设计。

以上是关于从 DbCommand.ExecuteReader 中的 Linq 选择中没有记录添加到 DataTable的主要内容,如果未能解决你的问题,请参考以下文章

如何从其他面板从 JTextField 获取输入

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?