【问题标题】:Populating ListControl from DataTable using Linq使用 Linq 从 DataTable 填充 ListControl
【发布时间】:2015-01-21 15:17:46
【问题描述】:

我正在尝试使用 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()

【问题讨论】:

    标签: asp.net vb.net linq


    【解决方案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() 
    

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

    【讨论】:

    • 我使用 Linq 来替换 For Each 方法。我可以通过用大括号括起来然后投射.ToArray() 将它放到一行中,效果很好。谢谢指点!我根据您的输入使用单行解决方案更新了问题。
    • 毕竟我们不需要那个 Function() :-)
    • @EvilDr:是的,你可以使用括号。不过,我也不喜欢他们。只是令人讨厌的错误的另一个来源,它们也使它更难阅读。所以删除它们并使用另一条线。由于 LINQ 的延迟执行,它花费了相同的时间,但更具可读性和可维护性。它也更容易调试,因为如果您在...AddRange 设置断点,您始终可以使用items.ToArray 执行查询
    • 你已经使用了ToArray,但是无论你选择它,还是选择ToListToDictionary 等等,它们都实现了 IEnumerable,所以我认为这并不重要,但是有什么方法最合适吗?
    • @EvilDr:你不能使用ToList,因为这会创建一个不能在ListItemCollection.AddRange中使用的List<ListItem>
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2013-02-19
    • 2023-04-06
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多