web-dev-qa-db-fra.com

Grouper par Sum Linq vers SQL en C #

Vraiment coincé avec Linq au regroupement et à la sommation SQL, j'ai cherché partout mais je ne comprends pas assez pour appliquer d'autres solutions à la mienne.

J'ai une vue dans ma base de données appelée view_ProjectTimeSummary, elle contient les champs suivants:

string_UserDescription
string_ProjectDescription
datetime_Date
double_Hours

J'ai une méthode qui accepte un paramètre de date de début et de fin et crée d'abord cette liste <>:

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

Avant de renvoyer la liste (à utiliser comme source de données pour un datagridview), je filtre le champ string_UserDescription à l'aide d'un paramètre du même nom:

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

return view_UserTimeSummaryToReturn;

Comment puis-je manipuler la liste résultante <> pour afficher le somme du champ double_Hours pour cet utilisateur et ce projet entre les paramètres de date de et de (et non des entrées distinctes pour chaque date)?

par exemple. une liste <> avec les champs suivants:

string_UserDescription
string_ProjectDescription
double_SumOfHoursBetweenToAndFromDate

Ai-je raison de dire que cela signifierait que je devrais renvoyer un autre type de List <> (car il contient moins de champs que view_UserTimeSummary)?

J'ai lu que pour obtenir la somme, c'est quelque chose comme 'group/by/into b' mais je ne comprends pas comment cette syntaxe fonctionne en regardant d'autres solutions ... Quelqu'un peut-il m'aider?

Merci Steve

14
vitalsigns.sa

Commencez par définir une classe pour contenir le résultat:

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

Puisque vous avez déjà appliqué le filtrage, la seule chose qui reste à faire est de grouper.

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

(ou l'autre syntaxe)

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();
32
Amy B