Linq возвращает список анонимных типов - PullRequest
2 голосов
/ 11 марта 2009

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 ]

5 голосов
/ 11 марта 2009

Проблема в том, что анонимный тип не имеет типа времени компиляции, который вы можете использовать в качестве возвращаемого значения для вашей функции, поэтому ???? в вашем списке (Of ????) нет того, что когда-либо может быть известно компилятору.

Поскольку вы связываете это с элементом пользовательского интерфейса, вам лучше всего сделать возвращаемое значение IEnumerable или IList. Вы должны быть в состоянии привязать свой контроль к этому (поскольку привязка использует отражение под крышками).

3 голосов
/ 11 марта 2009

Анонимные типы не могут выходить за рамки функции. Поэтому то, что вы пытаетесь сделать, невозможно. Вам нужно будет создать тип (структуру или класс), который вы можете использовать возвращаемый тип.

2 голосов
/ 09 октября 2012

Вы можете использовать функцию linq CAST, затем вы преобразуете свой список в Object и возвращаете Enumerable 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
2 голосов
/ 04 июня 2009

См. 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, Описание, 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
1 голос
/ 11 марта 2009

Если класс является единственным, который будет использовать результат (хотя это кажется маловероятным, поскольку вы сделали функцию Public), вы можете создать вложенный класс / структуру для хранения результатов. В противном случае то, что вы хотите сделать, невозможно: анонимные типы могут иметь только область действия метода .

...