Domanda

Caan Somone consiglia il miglior approccio a ciò che sto cercando di ottenere (linq a sql, restituzione dell'elenco di dati da mostrare in una griglia / elenco ecc. ecc.) Si lamenta della conversione anonima del tipo e da ciò che sto leggendo, non è un modo elegante di farlo.

  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
È stato utile?

Soluzione

Il problema è che un tipo anonimo non ha un tipo di compilazione che puoi usare come valore di ritorno per la tua funzione, quindi il ???? nella tua lista (Of ????) non è qualcosa che possa mai essere conosciuto dal compilatore.

Dato che lo stai vincolando a un elemento dell'interfaccia utente, la soluzione migliore è probabilmente quella di rendere il valore di ritorno un IEnumerable o IList. Dovresti essere in grado di vincolare il tuo controllo a questo (poiché l'associazione utilizza la riflessione sotto le copertine).

Altri suggerimenti

I tipi anonimi non possono lasciare l'ambito di una funzione. Quindi quello che stai cercando di fare non è possibile. Dovrai creare un tipo (struct o class) che puoi usare un tipo restituito.

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

Definisci il tuo oggetto classe dati ad es. MyClass con proprietà ActionOn, ActionBy, Description, ImpactedItem, ActionDescription .

Quindi utilizzare:

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

Puoi usare la funzione linq CAST, quindi lanciare la tua lista come Oggetto e restituire un Ienumerable di 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

Se la classe è l'unica che utilizzerà il risultato (anche se questo sembra improbabile da quando hai creato la funzione Public ), puoi creare una classe / struttura annidata per contenere i risultati. Altrimenti, ciò che vuoi fare non è possibile: i tipi anonimi possono avere solo il metodo ambito .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top