2013-01-19 13 views
8

Ho la seguente struttura di classe:Linq Selezionare Raggruppa per

public class PriceLog 
{ 
    public DateTime LogDateTime {get; set;} 
    public int Price {get; set;} 
} 

Per un elenco < PriceLog> Voglio una query LINQ per generare un output che è equivalente ai dati rappresentati come di seguito:

LogDateTime | AVG (Prezzo)
gen 2012 | 2000
feb 2012 | 3000

Semplicemente: voglio calcolare il prezzo medio su ogni mese dell'anno.
Nota: la proprietà LogDateTime deve essere formattato come LogDateTime.ToString("MMM yyyy")

ho provato quanto segue, ma non è sicuro se si genererà il risultato desiderato:

var result = from priceLog in PriceLogList 
         group priceLog by priceLog.LogDateTime.ToString("MMM yyyy") into dateGroup 
         select new PriceLog { GoldPrice = (int)dateGroup.Average(p => p.GoldPrice), SilverPrice = (int)dateGroup.Average(p => p.SilverPrice)}; 

risposta

18

Ciò fornirà una sequenza di oggetti anonimi, contenente la stringa di date e due proprietà con il prezzo medio:

var query = from p in PriceLogList 
      group p by p.LogDateTime.ToString("MMM yyyy") into g 
      select new { 
       LogDate = g.Key, 
       AvgGoldPrice = (int)g.Average(x => x.GoldPrice), 
       AvgSilverPrice = (int)g.Average(x => x.SilverPrice) 
      }; 

Se avete bisogno di ottenere l'elenco di oggetti PriceLog:

var query = from p in PriceLogList 
      group p by p.LogDateTime.ToString("MMM yyyy") into g 
      select new PriceLog { 
       LogDateTime = DateTime.Parse(g.Key), 
       GoldPrice = (int)g.Average(x => x.GoldPrice), 
       SilverPrice = (int)g.Average(x => x.SilverPrice) 
      }; 
2
from p in PriceLog 
    group p by p.LogDateTime.ToString("MMM") into g 
    select new 
    { 
     LogDate = g.Key.ToString("MMM yyyy"), 
     GoldPrice = (int)dateGroup.Average(p => p.GoldPrice), 
     SilverPrice = (int)dateGroup.Average(p => p.SilverPrice) 
    } 
+0

g.LogDateTime restituisce un errore! – Lucifer

+0

risposta è stata modificata. – MuhammadHani

2

Si dovrebbe provare in questo modo:

var result = 
     from priceLog in PriceLogList 
     group priceLog by priceLog.LogDateTime.ToString("MMM yyyy") into dateGroup 
     select new { 
      LogDateTime = dateGroup.Key, 
      AvgPrice = dateGroup.Average(priceLog => priceLog.Price) 
     }; 
1
var result = priceLog.GroupBy(s => s.LogDateTime.ToString("MMM yyyy")).Select(grp => new PriceLog() { LogDateTime = Convert.ToDateTime(grp.Key), Price = (int)grp.Average(p => p.Price) }).ToList(); 

ho convertito in int perché il mio campo di prezzo era int e media metodo di restituire il doppio .Io spero che questo vi aiuterà