2013-05-21 16 views
12

Davvero bloccato con il raggruppamento e il sommario di SQL, ho cercato ovunque ma non ho capito abbastanza per applicare altre soluzioni al mio.Raggruppa per Sum Linq a SQL in C#

ho una visione nel mio database chiamato view_ProjectTimeSummary, questo ha i seguenti campi:

string_UserDescription 
string_ProjectDescription 
datetime_Date 
double_Hours 

Ho un metodo che accetta un da e per il parametro data e crea innanzitutto questo elenco <>:

List<view_UserTimeSummary> view_UserTimeSummaryToReturn = 
      (from linqtable_UserTimeSummaryView 
       in datacontext_UserTimeSummary.GetTable<view_UserTimeSummary>() 
       where linqtable_UserTimeSummaryView.datetime_Week <= datetime_To 
       && linqtable_UserTimeSummaryView.datetime_Week >= datetime_From 
       select linqtable_UserTimeSummaryView).ToList<view_UserTimeSummary>(); 

Prima di restituire l'elenco (da utilizzare come origine dati per un datagridview) a filtrare il campo string_UserDescription utilizzando un parametro con lo stesso nome:

if (string_UserDescription != "") 
     { 
      view_UserTimeSummaryToReturn = 
         (from c in view_UserTimeSummaryToReturn 
         where c.string_UserDescription == string_UserDescription 
         select c).ToList<view_UserTimeSummary>(); 
     } 

return view_UserTimeSummaryToReturn; 

Come faccio a manipolare la lista risultante <> per mostrare la somma delle double_Hours di campo per l'utente e di progetto tra la da e per i parametri di data (e non elencare separatamente ciascun data)?

ad es. un elenco <> con i seguenti campi:

string_UserDescription 
string_ProjectDescription 
double_SumOfHoursBetweenToAndFromDate 

ho ragione che questo vorrebbe dire che avrei dovuto restituire un diverso tipo di List <> (dal momento che ha meno campi rispetto alla view_UserTimeSummary)?

Ho letto che per ottenere la somma è qualcosa come 'group/by/in b' ma non capisco come questa sintassi funzioni da altre soluzioni ... Qualcuno può aiutarmi per favore?

Grazie Steve

+0

Grazie David - grandi opere - inizialmente mi sono dimenticato di usare la parte get/set in modo che non stava mostrando nel mio datagridview, qualcosa a che fare con la le colonne autogenerate funzionano solo se gli oggetti nell'elenco hanno solo campi, non proprietà ... –

risposta

29

iniziare definendo una classe per contenere il risultato:

public class GroupedRow 
{ 
    public string UserDescription {get;set;} 
    public string ProjectDescription {get;set;} 
    public double SumOfHoursBetweenToAndFromDate {get;set;} 
} 

Dal momento che avete già applicato il filtro, l'unica cosa che resta da fare è di gruppo.

List<GroupedRow> result = 
(
    from row in source 
    group row by new { row.UserDescription, row.ProjectDescription } into g 
    select new GroupedRow() 
    { 
    UserDescription = g.Key.UserDescription, 
    ProjectDescription = g.Key.ProjectDescription, 
    SumOfHoursBetweenToAndFromDate = g.Sum(x => x.Hours) 
    } 
).ToList(); 

(o l'altro di sintassi)

List<GroupedRow> result = source 
    .GroupBy(row => new {row.UserDescription, row.ProjectDescription }) 
    .Select(g => new GroupedRow() 
    { 
    UserDescription = g.Key.UserDescription, 
    ProjectDescription = g.Key.ProjectDescription, 
    SumOfHoursBetweenToAndFromDate = g.Sum(x => x.Hours) 
    }) 
    .ToList(); 
+0

Potrebbe essere necessario implementare INotifyPropertyChanging e INotifyPropertyChanged su GroupedRow –

+0

qual è la differenza tra la prima e la seconda sintassi. C'è una terminologia distinta questi due? – mko

+2

La prima sintassi di @John è la sintassi "query comprehension". Il secondo è chiamate di metodo con espressioni lambda. Fanno la stessa cosa –