J'ai une application qui permet aux utilisateurs d'entrer le temps qu'ils consacrent à leur travail, et je suis en train de faire quelques bons rapports construit pour ce qui tire profit de LINQ to entities. Parce que chaque TrackedTime
a TargetDate
qui est juste la "Date" partie d'un DateTime
, il est relativement simple de groupe à la fois par l'utilisateur et la date (je pars le "où" clauses pour des raisons de simplicité):
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, t.TargetDate} into ut
select new
{
UserName = ut.Key.UserName,
TargetDate = ut.Key.TargetDate,
Minutes = ut.Sum(t => t.Minutes)
};
Grâce à l' DateTime.Month
de la propriété, le regroupement par utilisateur et par Mois est seulement un peu plus compliqué:
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, t.TargetDate.Month} into ut
select new
{
UserName = ut.Key.UserName,
MonthNumber = ut.Key.Month,
Minutes = ut.Sum(t => t.Minutes)
};
Maintenant vient la partie difficile. Est-il un moyen fiable de groupe par Semaine? J'ai essayé les options suivantes en fonction de cette réponse à une semblable LINQ to SQL question:
DateTime firstDay = GetFirstDayOfFirstWeekOfYear();
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days / 7} into ut
select new
{
UserName = ut.Key.UserName,
WeekNumber = ut.Key.WeekNumber,
Minutes = ut.Sum(t => t.Minutes)
};
Mais LINQ to entities n'apparaît pas à l'appui des opérations arithmétiques sur les objets DateTime, de sorte qu'il ne sait pas comment faire, (t.TargetDate - firstDay).Days / 7
.
J'ai réfléchi à la création d'un Affichage dans la base de données que tout simplement les cartes de quelques jours à quelques semaines, et puis en ajoutant que la Vue de mon Entity Framework contexte et de se joindre à elle dans ma requête LINQ, mais cela ressemble à beaucoup de travail pour quelque chose comme ça. Est-il un bon travail autour de l'arithmétique approche? Quelque chose qui fonctionne avec Linq to entities, que je peux tout simplement l'intégrer dans le LINQ déclaration sans avoir à toucher la base de données? D'une certaine façon de dire Linq to entities comment soustraire une date à partir d'un autre?
Résumé
Je tiens à remercier tout le monde pour leur réfléchie et créative réponses. Après tout ce va-et-vient, c'est comme la vraie réponse à cette question est "attendre jusqu'à ce que .NET 4.0." Je vais donner la prime à Noldorin pour donner le plus pratique, qui exploite encore LINQ, avec une mention spéciale à Jacob Proffitt de venir avec une réponse qui utilise Entity Framework, sans la nécessité pour les modifications de la base de données secondaires. Il y avait d'autres réponses grands, trop, et si vous êtes à la recherche à la question pour la première fois, je voudrais vous recommandons fortement de lire par tous ceux qui ont été voté, ainsi que leurs commentaires. Cela a été vraiment un superbe exemple de la puissance de StackOverflow. Merci à vous tous!