Elenco di restituzione Linq di tipi anonimi
-
10-07-2019 - |
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
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.
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 .