2010-06-16 6 views
3

Je n'arrive pas à trouver de bonne référence à ce sujet. J'ai beaucoup de données en SQL avec des dates. Je voulais donc faire un graphique linéaire pour montrer ces données au fil du temps. Si je veux le montrer sur une période de jours alors j'ai besoin de grouper par jours .. Mais le LOGDATE est la date complète .. pas le jour ..LINQ. Regroupement par jours. Comment faire cela facilement?

Ainsi j'ai ceci ci-dessous, mais LINQ ne sait pas ce que la propriété 'DayOfYear' est ...

var q = from x in dc.ApplicationLogs 
       let dt = x.LogDate 
       group x by new { dayofyear = dt.Value.DayOfYear } into g 
       select new 
       { 
        iCount = g.Count(), 
        strDate = g.Key 
       }; 
+1

Utilisez-vous LINQ to SQL? – SLaks

+0

linq2ent .. .indique que certaines fonctions de date sont restreintes ce qui explique pourquoi c'est si difficile je suppose – punkouter

+0

Je peux utiliser LogDate.Value.Day mais pas LogDate.Value.ShortDateTime() – punkouter

Répondre

2

Vous pouvez utiliser DbFunctions.TruncateTime:

pour retourner la date indiquée avec la partie de temps Effacé

var q = from x in dc.ApplicationLogs 
     let dt = DbFunctions.TruncateTime(x.LogDate) 
     group x by dt into g 
     select new 
     { 
      iCount = g.Count(), 
      strDate = g.Key 
     }; 
+0

Cheers. Cela m'a pris un moment sur Google à la recherche de ceci -> exactement ce dont j'avais besoin. – pfeds

0

Pourquoi utilisez-vous:

let dt = x.LogDate 
    group x by new { dayofyear = dt.Value.DayOfYear } into g 

au lieu de simplement:

group x by x.LogDate.Value.DayOfYear into g 

Je ne suis pas sûr à ce sujet, mais il est possible d'utiliser un objet anonyme comme ça dans votre clause group by est de déconner L2S.

+0

dayofyear n'est pas supporté par Line2Ent. :( – punkouter

+0

Cela fonctionne .. mais uniquement pour les données dans le mois :( var q = de x dans le groupe dc.ApplicationLogs x par le nouveau {} x.LogDate.Value.Day en g sélectionner de nouveaux { DayDate = g.Key.Day, iCount = g.Count() }; – punkouter

+0

Que diriez-vous simplement de récupérer toutes les données dans une liste , puis de faire le regroupement avec les anciens objets LINQ-à- – tzaman

2

Vous voulez .Date pour obtenir la date faisant partie d'un DateTime et non DayOfyear, sauf si vous essayez délibérément de mettre le même jour de l'année dans le groupe.

0

Ici, vous allez

let d = new DateTime(n.time.Year, n.time.Month, n.time.Day) group n by d into grp select grp 
+0

L'appel 'new DateTime (...)' dans une requête LINQ to Entities échouera http://stackoverflow.com/questions/17367649/only-parameterless -constructeurs-et-initialisateurs-sont-supportés-en-linq -to-entiti – jocull