使用 Linq 从 DataTable 填充 ListControl

Populating ListControl from DataTable using Linq

我正在尝试使用 Linq 将 DataColumn 值推送到 ListControl。我的Linq代码如下:

ddl_listControl.Items.AddRange(
    From dr As DataRow In ds.Tables(0).Row Select New ListItem(
        dr.Item("Value").ToString(), 
        dr.Item("ID").ToString()
    )
)

Unable to cast object of type 'WhereSelectEnumerableIterator`2[System.Object,System.Web.UI.WebControls.ListItem]' to type 'System.Web.UI.WebControls.ListItem[]'.

谁能告诉我如何更正 Linq?

回答

根据 Tim 的输入,我使用了:

ddl_regionSelected.Items.AddRange((From dr As DataRow In ds.Tables(0).Rows Select New ListItem(dr.Item("regionName").ToString(), dr.Item("ID").ToString())).ToArray())

或者对于那些非常喜欢 C# 样式的人...(!)

ddl_regionSelected.Items.AddRange((From dr As DataRow In ds.Tables(0).Rows
                                           Select New ListItem(
                                               dr.Item("regionName").ToString(),
                                               dr.Item("ID").ToString())
                                           ).ToArray())

我遗漏的部分是将整个 Linq 语句用大括号括起来,然后转换为结果 .ToArray()

ListItemCollection.AddRange 只接受 ListItem[] 所以使用:

Dim items = From rom In ds.Tables(0).AsEnumerable() 
            Select New ListItem(dr.Item("Value").ToString(),dr.Item("ID").ToString())
ddl_listControl.Items.AddRange(items.ToArray())

或一个不需要新数组的简单循环:

For Each item As ListItem in items 
    ddl_listControl.Items.Add(item)
Next

由于 ugly function keyword,我更喜欢 VB.NET 中这种查询和方法语法的混合,而不是纯方法语法。但是,这里是:

Dim items As ListItem() = ds.Tables(0).AsEnumerable().
    Select(Function(dr) New ListItem(dr.Item("Value").ToString(),dr.Item("ID").ToString())).
    ToArray() 

即使它是(技术上)单个语句,也不会更有效。