2013-05-21 22 views
12

Naprawdę utknąłem z Linq do grupowania i podsumowania SQL, przeszukaliśmy wszędzie, ale nie rozumiem wystarczająco dużo, aby zastosować inne rozwiązania na własną rękę.Grupa Suma Linq do SQL w C#

Mam widoku w mojej bazy danych o nazwie view_ProjectTimeSummary ta ma następujące pola:

string_UserDescription 
string_ProjectDescription 
datetime_Date 
double_Hours 

Mam metodę, która przyjmuje do iz data parametru i najpierw tworzy Ta lista <>:

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>(); 

Przed powrotem liście (być używany jako źródło danych dla DataGridView) filtrować pole string_UserDescription za pomocą parametru o tej samej nazwie:

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

return view_UserTimeSummaryToReturn; 

Jak mogę manipulować wynikowej liście <> pokazać sumę z double_Hours polowych dla danego użytkownika i projektu pomiędzy do i od parametrów daty (a nie odrębnych zapisów na każdy dzień)?

np. List <> z następujących dziedzin:

string_UserDescription 
string_ProjectDescription 
double_SumOfHoursBetweenToAndFromDate 

Mam rację, że oznaczałoby to, że będę musiał wrócić inny typ listy <> (ponieważ ma mniej pól niż view_UserTimeSummary)?

Przeczytałem, że aby uzyskać sumę, jest to coś w rodzaju "grupy/przez/do b", ale nie rozumiem, jak ta składnia działa, patrząc na inne rozwiązania ... Czy ktoś może mi pomóc?

Dzięki Steve

+0

Dzięki David - działa świetnie - początkowo zapomniał użyć get/set część więc nie było widać w moim DataGridView, coś wspólnego z kolumny autogenerate działają tylko wtedy, gdy obiekty na liście mają tylko pola, a nie właściwości ... –

Odpowiedz

29

Zacznij od zdefiniowania klasy trzymać wynik:

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

Skoro już stosowane filtrowanie, jedyną rzeczą do zrobienia jest grupa.

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(); 

(lub inna składnia)

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

Być może trzeba zaimplementować INotifyPropertyChanging i INotifyPropertyChanged na GroupedRow –

+0

jaka jest różnica między pierwszą a drugą składnią. Czy istnieje terminologia odrębna? – mko

+2

@John pierwsza składnia to składnia "zapytań ze zrozumieniem". Drugi to wywołania metod z wyrażeniami lambda. Robią to samo. –