2016-04-22 61 views
-1

我看到很多复杂的例子用于转换DataTable与多成员行here但在我的情况下,查询只是从表中返回一列,也就是说0..N个字符串/ varchars,如:如何使用单列DataTable的结果填充字符串的通用列表?

[email protected] 
[email protected] 

我觉得这样的事情应该工作:

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'的公共定义“)

我尝试在”UnitReportPairEmailValsDT“中追加”.AsEnumerable“为”“,但这也激起了编译器的愤怒。

+1

'List dbNames = myDT.AsEnumerable()。Select(n => n.Field (“Name”))。ToList();' – Plutonix

回答

2

错误说你不能通过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(); 
2

尝试这样的事:

List<String> emailAddresses = new List<string>(); 
foreach (DataRow row in UnitReportPairEmailValsDT.Rows) 
{ 
    emailAddresses.Add(row.Item(0)); 
} 
+0

您的意思是“row.Item(0)”,而不是“dr .Item(0)“对不对? –

+0

这工作(无论如何编译):emailAddresses.Add(dr [0] .ToString()); –

1

假设DT然后使用LINQ数据表: dt.Rows.Select(X = > x [0] +“”)。ToList()会给你List。请小心使用Select(x => xToString()),因为如果列值为null,则容易出错。 x [0] +“”确保返回null空字符串。