Linq返回匿名类型列表

时间:2009-03-11 09:52:33

标签: asp.net vb.net linq linq-to-sql anonymous-types

Caan somone建议我尝试实现的最佳方法(linq to sql,返回数据列表以显示在网格/列表等等)...它抱怨匿名类型转换,并从我的内容在阅读,这不是优雅的做法。

  Public Function GetHistory(ByVal historyId As Integer) As List(Of ?????????)
    Using dc As New myDataContext(Application.GetConnection)
      Return (From t In dc.ActionTypes, a In t.MyTable Where a.HistoryID = historyId Select a.ActionOn, a.ActionBy, t.Description, a.ImpactedItem, a.ActionDescription).ToList
    End Using
  End Function

5 个答案:

答案 0 :(得分:5)

问题是匿名类型没有可用作函数返回值的编译时类型,所以????在你的列表中(Of ????)并不是编译器可以知道的东西。

由于您将此绑定到UI元素,因此最好的办法是将返回值设为IEnumerable或IList。您应该能够将控件绑定到该控件(因为绑定使用了封面下的反射)。

答案 1 :(得分:3)

匿名类型不能离开函数的范围。所以你要做的就是不可能。您必须创建一个可以使用返回类型的类型(结构或类)。

答案 2 :(得分:2)

请参阅http://blogs.msdn.com/swiss_dpe_team/archive/2008/01/25/using-your-own-defined-type-in-a-linq-query-expression.aspx

定义您自己的数据类对象,例如 MyClass ,其属性为 ActionOn,ActionBy,Description,ImpactedItem,ActionDescription

然后使用:

Public Function GetHistory(ByVal historyId As Integer) As List(Of MyClass)
    Using dc As New myDataContext(Application.GetConnection)
        Return ( _
            From t In dc.ActionTypes, a In t.MyTable _
            Where a.HistoryID = historyId _
            Select New MyClass _
            With {.ActionOn=a.ActionOn, .ActionBy=a.ActionBy, ...} _
        ).ToList
    End Using
End Function

答案 3 :(得分:2)

您可以使用linq函数CAST,然后将列表转换为Object并返回Ienumerable of Object。

Public Function GetHistory(ByVal historyId As Integer) As  List(Of Object)

    Using dc As New myDataContext(Application.GetConnection)

  Return (From t In dc.ActionTypes, a In t.MyTable Where _
          a.HistoryID = historyId Select a.ActionOn, a.ActionBy, _
          t.Description, a.ImpactedItem, a.ActionDescription) _
          .Cast(Of Object).ToList()

    End Using


End Function

答案 4 :(得分:1)

如果该类是唯一一个将使用结果的类(虽然这似乎不太可能,因为你创建了函数Public),你可以创建一个嵌套的类/结构来保存结果。否则,您无法执行的操作:匿名类型可能只有method scope