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