#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.