3.939 messaggi dal 28 gennaio 2003
Ho una classe così definita
Private Class misura
  Public Property stazione As String
  Public Property grandezza As String
  Public Property data As DateTime
  Public Property valore As Double
End Class


e una lista così definita
Dim misure As New List(Of misura)()


vorrei estrarre i dati tipo matrice:
1° colonna = Data
2° colonna = Grandezza1
3° colonna = Grandezza2

dove, sotto grandezza1 e 2, per esempio, Min(grandezza1), min(grandezza2) per la data della prima colonna

Non so se mi sono spiegato. Mi dareste una mano?

ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Pietro, Buone Feste!

pietro09 ha scritto:

e una lista così definita
Dim misure As New List(Of misura)()

Ok, dunque hai una lista di oggetti residenti in memoria e possiamo usare gli extension methods di Linq to Objects.
Dovresti per prima cosa raggruppare per data gli elementi della lista. Da ciascun gruppo, dovrai filtrare gli elementi che appartengono alla Grandezza1 ed ottenere il valore minimo. Stessa cosa per Grandezza2 e per ogni altra ulteriore grandezza. Assegnerai questi valori alle proprietà del tipo proiettato dalla query.

Guarda questo esempio, proietta un tipo anonimo con data, valore minimo per la prima grandezza e valore minimo per una seconda grandezza.
https://dotnetfiddle.net/ye8NHJ
Tuttavia, se il numero delle Grandezze è dinamico, questa soluzione non è adatta.

Tale Fons Sonnemans ha scritto questo extension method "Pivot" che invece può funzionare con un numero arbitrario di grandezze.
http://www.reflectionit.nl/Blog/2009/c-linq-pivot-function
Ecco il suo extension method
http://extensionmethod.net/csharp/ienumerable-t/pivot

ciao,
Moreno
Modificato da BrightSoul il 26 dicembre 2014 15.00 -

Enjoy learning and just keep making
3.939 messaggi dal 28 gennaio 2003
Ti ringrazio. Guarderò con molta attenzione!
Ciao.
3.939 messaggi dal 28 gennaio 2003
Purtroppo ho delle perplessità.
Mi spiego. Estraggo le statistiche (pivot) utilizzando Oracle. Conoscendo la sintassi dell'sql è abbastanza semplice costruire una stringa dinamicamente (secondo la scelta dell'utente). Data questa sql, è semplice poi recuperare i dati.

Ho trovato in rete la stessa operazione, ma fatto con il DataTable, con risultati, per quanto ho potuto vedere, buoni.

Qui invece, mi pare che non sia dinamico, ma occorra cablare il codice.

Oppure ho capito male?

ciao.
11.886 messaggi dal 09 febbraio 2002
Contributi
pietro09 ha scritto:

Conoscendo la sintassi dell'sql è abbastanza semplice costruire una stringa dinamicamente

Certo, se puoi cavartela con una query SQL (o con una stored procedure) è meglio. Probabilmente avrai anche prestazioni migliori se lasci fare il lavoro al motore del database server.

C'è un motivo particolare per cui hai bisogno di farlo con una query Linq?

pietro09 ha scritto:

Qui invece, mi pare che non sia dinamico, ma occorra cablare il codice.

La soluzione che usa l'extension method Pivot è dinamica: devi fornire la lista con le misure ed indicare i due campi per cui vuoi raggruppare, ovvero Data e Grandezza. Inoltre, passa la funzione di aggregazione Min. Quindi potresti provare con:
Dim risultato = lista.Pivot(Function(misura) misura.Data, Function(misura) misura.Grandezza, Function(gruppo) gruppo.Min(Function(misura) misura.Valore));


ciao,
Moreno
Modificato da BrightSoul il 26 dicembre 2014 17.05 -

Enjoy learning and just keep making
3.939 messaggi dal 28 gennaio 2003
C'è un motivo particolare per cui hai bisogno di farlo con una query Linq


Nessun motivo se non imparare ad usare meglio LINQ! del resto non sempre si ha una tabella Oracle.

Guarderò con più attenzione la libreria consigliata.

Ciao.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.