Ho una classe composta dai campi
data, campo1, campo2, campo3, campo4
Ho una lista di questa classe.
Il mio obiettivo è prelevare gli ultimi campi compilati in modo da avere:
campo1 alla data1, ..., campon alla datan
questa è l'immagine dei dati e del risultato

Questo è il codice di test che ho fatto (NOTA: è collaudato con una pagina aspx per mia comodità).
Il problema è che, anche se funziona, ho la sensazione di aver usato male LINQ nel senso che, dato che lo conosco poco, mi pare di aver usato troppo codice che magari non serve
codice:
'classe dati di partenza
Private Class prova
Public Property Data As DateTime?
Public Property Campo1 As Integer?
Public Property Campo2 As Integer?
Public Property Campo3 As Integer?
Public Property Campo4 As Integer?
End Class
'classe risultati
Private Class prova1
Inherits prova
Public Property Data1 As DateTime?
Public Property Data2 As DateTime?
Public Property Data3 As DateTime?
Public Property Data4 As DateTime?
End Class
Protected Sub BindData()
Dim lista As New List(Of prova) From
{
New prova() With {.Data = #3/15/2011#, .Campo1 = 1},
New prova() With {.Data = #3/16/2011#, .Campo1 = 2},
New prova() With {.Data = #3/17/2011#, .Campo2 = 3},
New prova() With {.Data = #3/18/2011#, .Campo2 = 4},
New prova() With {.Data = #3/19/2011#, .Campo3 = 5}
}
Dim result1 = lista.OrderByDescending(Function(s) s.Data).Where(Function(s) s.Campo1.HasValue).Select(Function(s) New With {s.Data, s.Campo1}).Take(1)
Dim result2 = lista.OrderByDescending(Function(s) s.Data).Where(Function(s) s.Campo2.HasValue).Select(Function(s) New With {s.Data, s.Campo2}).Take(1)
Dim result3 = lista.OrderByDescending(Function(s) s.Data).Where(Function(s) s.Campo3.HasValue).Select(Function(s) New With {s.Data, s.Campo3}).Take(1)
Dim result4 = lista.OrderByDescending(Function(s) s.Data).Where(Function(s) s.Campo4.HasValue).Select(Function(s) New With {s.Data, s.Campo4}).Take(1)
Dim result As New prova1()
If result1.Count > 0 Then
result.Campo1 = result1.First.Campo1
result.Data1 = result1.First.Data
End If
If result2.Count > 0 Then
result.Campo2 = result2.First.Campo2
result.Data2 = result2.First.Data
End If
If result3.Count > 0 Then
result.Campo3 = result3.First.Campo3
result.Data3 = result3.First.Data
End If
If result4.Count > 0 Then
result.Campo4 = result4.First.Campo4
result.Data4 = result4.First.Data
End If
'visualizza i dati originali ordinati per data in ordine discendente
Me.GridView1.DataSource = lista.OrderByDescending(Function(s) s.Data)
Me.GridView1.DataBind()
'visualizzo il risultato
Me.GridView2.DataSource = New List(Of prova1)() From {result}.Select(Function(s) New With {.campo1 = s.Campo1, .data1 = s.Data1, .campo2 = s.Campo2, .data2 = s.Data2, .campo3 = s.Campo3, .data3 = s.Data3, .campo4 = s.Campo4, .data4 = s.Data4})
Me.GridView2.DataBind()
End Sub