【问题标题】:LINQ strong typingLINQ 强类型
【发布时间】:2012-02-05 01:25:42
【问题描述】:

我知道 LINQ 应该自动返回强类型结果集。但是,当我将 ObjectDataSource 附加到基于 LINQ 的方法时(没有显式返回类型),我无法访问 LINQ 中定义的任何列。

示例方法:

   <System.ComponentModel.DataObjectMethod(ComponentModel.DataObjectMethodType.Select)> _
    Public Function GetMarketClusterList() As IEnumerable(Of MarketCluster)
        Return From d In db.tblMarkets
               Select New MarketCluster With {.MarketCluster = d.MarketCluster}
               Distinct
    End Function

    Public Class MarketCluster
        Public MarketCluster As String
    End Class

编辑 我将代码更改为使用显式类型并选择其中。至少现在我知道返回类型,但它对原始问题没有帮助。更奇怪的是,我在调试器中发现,如果我这样做了

它失败并说“在所选数据源上找不到名为 MarketCluster 的字段或属性”,但如果我这样做 效果很好!

【问题讨论】:

  • 为什么不指定函数的返回类型?
  • 我认为 Distinct 不会达到您的预期。它将比较引用而不是您设置 .MarketCluster 的字符串,并且由于您正在构建列表中的所有对象,因此您在引用上调用 distinct 都已经是唯一的
  • 为什么不简单地返回一个 IEnumerable(Of String) 而不是引入一个包装类?

标签: vb.net linq entity-framework linq-to-entities


【解决方案1】:

只需指定返回类型:

Public Function GetMarketClusterList() As IEnumerable(Of MarketCluster)
    Return From d In db.tblMarkets
           Select d.MarketCluster
           Distinct
End Function

(或使用IQueryable 代替IEnumerable

...假设d.MarketCluster 的类型是MarketCluster

如果Option Strict 仍然打开,则返回类型是必需...这表明您可能没有打开它。我强烈建议您为您的项目启用Option Strict,无论您是否使用 LINQ,除非您特别需要后期绑定等(在这种情况下,我会尝试将其限制为仅需要的地方)。

【讨论】:

  • 返回类型是 IEnumerable(Of ),而不是 MarketCluster。如何更改?
  • @just.another.programmer:为什么会是匿名类型?您只是在选择 d.MarketCluster... 如果您的实际查询有一个匿名类型的 select 语句,您应该这么说 - 因为此时您 不能 将其声明为返回以强类型的方式输入。
  • 我发布的查询是我在代码中的真正准确查询。当我使用智能感知检查返回类型时,它告诉我这是一个 IQueryable(Of )。
  • @just.another.programmer:我不是 VB 程序员,我知道有时 VB确实引入匿名类型不如 C#...不明白为什么会在这里这样做。如果删除 Distinct 会发生什么(只是为了实验)? d.MarketCluster 这里的类型是什么? (将鼠标悬停在它上面会发生什么?)
  • 这是一个字符串。我只是将其设为显式类型(请参阅问题编辑)以避免这部分问题,但仍然无法在我的 ODS 中正确使用它。
【解决方案2】:

错误信息说的是确切的错误,我只是错过了。当它说找不到“属性”时,它意味着名为“属性”的类成员。我把我的代码改成了这个,现在它可以完美地工作了。

Private _MarketCluster As String
Public Property MarketCluster As String
    Get
       Return _MarketCluster
    End Get
    Set(value As String)
       _MarketCluster = value
    End Set
End Property

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 2010-10-08
    • 2013-08-04
    • 2011-05-22
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多