Как можно заполнить общий список строк результатами из DataTable с одним столбцом?
Я вижу множество сложных примеров преобразования DataTable со строками из нескольких элементов, но в моем случае запрос просто возвращает один столбец из таблицы, то есть 0..N строк / вариантов, таких как:
bbfinaleofseem@wallacestevens.org
eyenoy@dunbar.com
Я думал, что-то вроде этого должно работать:
DataTable UnitReportPairEmailValsDT = new DataTable();
string qry = string.Format(SQL.UnitReportPairEmailQuery, unit, rptId);
UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
qry,
CommandType.Text,
null
);
List<String> emailAddresses = new List<string>();
foreach (string emailaddr in UnitReportPairEmailValsDT)
{
emailAddresses.Add(emailaddr);
}
... но он не будет компилироваться (" оператор foreach не может работать с переменными типа" System.Data.DataTable ", потому что" System.Data.DataTable "не содержит общедоступного определения для" GetEnumerator " ")
Я тоже пытался добавить ".AsEnumerable" в "в UnitReportPairEmailValsDT", но это также вызвало гнев компилятора.
3 ответа
Ошибка говорит, что вы не можете перебрать DataTable
сам объект, вероятно, что вам нужно циклически DataRows
,
Использовать этот.
foreach(DataRow row in UnitReportPairEmailValsDT.Rows)
{
emailAddresses.Add(row["emailaddr"].ToString()); // assuming you have emailaddr column.
}
Другой вариант, использовать Linq
emailAddresses = UnitReportPairEmailValsDT
.AsEnumerable()
.Select(row=> row.Field<string>("emailaddr"))
.ToList();
Попробуйте что-то вроде этого:
List<String> emailAddresses = new List<string>();
foreach (DataRow row in UnitReportPairEmailValsDT.Rows)
{
emailAddresses.Add(row.Item(0));
}
Предположим, что dt - это ваша таблица данных, тогда с помощью Linq: dt.Rows.Select(x=> x[0]+"").ToList() выдаст вам List. Остерегайтесь использования Select(x=>xToString()), так как он подвержен ошибкам, если значение столбца равно нулю. x[0]+"" гарантирует, что в случае нуля будет возвращена пустая строка.