没有记录添加到Linq Select from DbCommand.ExecuteReader中的数据表中

没有记录添加到Linq Select from DbCommand.ExecuteReader中的数据表中,linq,datareader,Linq,Datareader,这段代码看起来应该可以工作,实际上它可以编译和运行。但是,来自cmd.ExecuetReader()的记录(还有记录)没有按预期添加到dt。有人看到可能遗漏了什么吗 DataTable dt = new DataTable(); cmd.Connection.Open(); cmd.ExecuteReader().Cast<DbDataRecord>().Cast<DataRow>().Select(r=>dt.Rows.Add(r.ItemArray)); Da

这段代码看起来应该可以工作,实际上它可以编译和运行。但是,来自
cmd.ExecuetReader()
的记录(还有记录)没有按预期添加到
dt
。有人看到可能遗漏了什么吗

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

或者,有没有一种更直接的方法可以做到这一点,当然是使用linq:)

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);
cmd.Connection.Open();
var data=cmd.ExecuteReader().Cast().Cast().Select(r=>r.ItemArray.ToList();
DataTable dt=新的DataTable();
foreach(数据中的var d)
dt.行。添加(d);

调用
ToList()
强制linq执行

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