Группа по сумме Linq to SQL в С#

Действительно застрял с группировкой и суммированием Linq to SQL, искал везде, но я не понимаю достаточно, чтобы применять другие решения для своих собственных.

У меня есть представление в моей базе данных с именем view_ProjectTimeSummary, это имеет следующие поля:

string_UserDescription
string_ProjectDescription
datetime_Date
double_Hours

У меня есть метод, который принимает параметр to и from date и сначала создает этот List < > :

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

Перед возвратом списка (для использования в качестве источника данных для datagridview) я фильтрую поле string_UserDescription с использованием параметра с тем же именем:

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

return view_UserTimeSummaryToReturn;

Как я могу обработать полученный List < > , чтобы показать sum поля double_Hours для этого пользователя и проекта между параметрами даты и времени (а не отдельными записями для каждой даты)?

например. Список < > со следующими полями:

string_UserDescription
string_ProjectDescription
double_SumOfHoursBetweenToAndFromDate

Я прав, что это означало бы, что мне придется возвращать другой тип List < > (поскольку он имеет меньше полей, чем view_UserTimeSummary)?

Я прочитал, что, чтобы получить сумму, это что-то вроде "group/by/in b", но не понимаю, как работает этот синтаксис, глядя на другие решения... Может ли кто-нибудь помочь мне?

Спасибо Стив

Ответ 1

Начните с определения класса для хранения результата:

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

Поскольку вы уже применяете фильтрацию, осталось только оставить группу.

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

(или другой синтаксис)

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