Никакие записи не добавляются в DataTable в Linq Select из 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));
  

Или есть более простой способ сделать это, используя 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 выполнить

Комментарии:

1. Спасибо. На самом деле только что обнаружил, что это приведение: Приведение<DbDataRecord>().Приведение<DataRow>() выдает исключение во время выполнения. Так что это не сработает. Нужен другой метод. Но я бы не хотел выполнять глупую итерацию reader, когда linq должен быть в состоянии это сделать.

2. Вот ответ, не относящийся к linq. DataTable dt = new DataTable(); cmd. Подключение. Open(); var x = cmd. ExecuteReader(); dt.Load(x, LoadOption. Перезаписать изменения);

3. Хорошо. Я искал способ добавить коллекцию строк в DataTable, поскольку я не очень дружу с ними. Обычно они приводят к плохому дизайну OO.