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