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


Rispondi quotando