使用Linq从DataTable填充ListControl

时间:2015-01-21 15:17:47

标签: asp.net vb.net 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()
    )
)
  

无法投射类型的对象   'WhereSelectEnumerableIterator`2 [System.Object的,System.Web.UI.WebControls.ListItem]'   输入'System.Web.UI.WebControls.ListItem []'。

任何人都可以建议如何更正Linq?

答案

根据蒂姆的意见,我使用了:

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()

1 个答案:

答案 0 :(得分:1)

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() 

即使它(技术上)是单一陈述,这也不是更有效。