【问题标题】:Linq query to list VB.NETLinq 查询列出 VB.NET
【发布时间】:2011-09-02 15:57:41
【问题描述】:
Dim query = From o In myContainer.MyObjects Select o.MyStringProperty Distinct

Dim myProperties As List(Of String) = query.ToList????? 'no way!!!'

“查询”类型为 IEnumerable(Of String)

我尝试将query 直接用作(infragistic)组合框的数据源,但它会抛出 NullReferenceException,因此我决定将其转换为字符串列表,以成为更“经典”的数据源。

Dim values As List(Of String) = query.AsQueryable().ToList()

也不起作用:“System.Collections.Generic.List(Of System.Linq.IQueryable(Of String))”类型的值不能转换为“System.Collections.Generic.List(Of String)” )'。

【问题讨论】:

  • 确保您有 Option Strict On。如果您有 Option Strict Off,您的查询可能会将结果推断为 IEnumerable(Of Object) 而不是字符串,并且 ToList 没有正确转换它。否则,删除 As List(Of String) 并查看推理返回的类型。我怀疑你在编译器隐藏的某个地方发生了隐式转换。

标签: .net vb.net linq


【解决方案1】:

您的错误消息表明 query 实际上是一个 List(Of T) 内部包含一个集合。

如果是这种情况,您可以使用SelectMany 来展平集合:

Dim values As List(Of String) = query.SelectMany(Function(m) m).ToList()

编辑:鉴于您的编辑以及评论,以下应该可以正常工作:

Dim values As List(Of String) = query.ToList()

【讨论】:

  • 似乎不起作用:“System.Collections.Generic.List(Of System.Collections.Generic.IEnumerable(Of Char))”类型的值无法转换为“System.Collections” .Generic.List(Of String)'.
  • @serhio: mmm - 如果是这样,那么 .ToList() 应该可以正常工作。
  • 编辑了我的答案 - 这实际上与您在“旧方法”中所做的相同......
  • 正如我在帖子中指出的那样,这种方法不存在。 ToList,因为“查询”是 IEnumerable(Of String)
  • @serhio:LINQ 扩展方法Enumerable.ToListIEnumerable(Of String) 上工作得很好。您的第一个版本应该可以工作。
【解决方案2】:

也许您应该尝试在查询变量上指定类型?

Dim query = From o In myContainer.MyObjects Select o.MyStringProperty Distinct

应该变成

Dim query As IEnumerable(Of String) = From o In myContainer.MyObjects Select o.MyStringProperty Distinct

如果 IEnumerable(Of String) 的类型不能用于查询,那么你需要像 Reed Copsey 所说的那样将列表展平。

【讨论】:

    【解决方案3】:

    最后,用好的旧方法解决了:)

      Dim values As New List(Of String)
    
      For Each item In query
        values.Add(item)
      Next item
    

    【讨论】:

    • 你的问题是如何用 Linq 做一些事情。您不应该错误地回答自己的问题然后接受它。
    • @Yatrix 别担心!投票将显示结果:-)
    • @FaizanMubasher 当然,但事实仍然是这是错误的答案。
    • 这就是我要说的。赞成票揭示了正确答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多