2010-12-08 4 views
4

Je souhaite écrire une requête Projection dans NHibernate qui regroupe les enregistrements par date et compte la valeur du champ "Taxe" pour ces enregistrements. Ma question est que la base de données a la valeur DateTime, comment vais-je les enregistrements du groupe juste par date et non time.Below est mon codeRequêtes NHibernate Projection groupées par date

template.Criteria.SetProjection(
       Projections.ProjectionList() 
       .Add(Projections.GroupProperty("IssueDatetime"), "DateVal") 
       .Add(Projections.Sum("Tax"), "TotalFare") 
      ); 

La base de données stocke le champ IssueDatetime en tant que type DateTime. Je veux compter la taxe par date et ignorer la partie temps. Quelqu'un peut-il m'aider avec l'exigence ci-dessus?

Répondre

8

Utilisez les éléments suivants pour la première projection:

Projections.GroupProperty(
    Projections.SqlFunction("date", 
          NHibernateUtil.Date, 
          Projections.GroupProperty("IssueDateTime"))) 

NH 2.x:

Projections.GroupProperty(
    Projections.SqlFunction(new SQLFunctionTemplate(
           NHibernateUtil.Date, 
           "dateadd(dd, 0, datediff(dd, 0, ?1))"), 
          NHibernateUtil.Date, 
          Projections.GroupProperty("IssueDateTime"))) 
+0

Lorsque j'utilise la projection ci-dessus je reçois l'erreur ci-dessous, erreur Le nom « NHibernateUtil » n'existe pas dans le contexte actuel. J'ai essayé d'inclure l'espace de noms NHibernate.Util mais il donne toujours la même erreur. – developer

+1

C'est dans l'espace de noms NHibernate, vérifiez votre orthographe. –

+0

Je ne sais pas pourquoi mais maintenant je reçois l'erreur ci-dessous, "Référence de l'objet n'est pas définie sur une instance d'un objet." – developer

2

En supposant SQL Server et T-SQL, ce ICriteria va le faire.

IList results = Session.CreateCriteria(typeof(Record), "record") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.SqlGroupProjection("CONVERT(date, {alias}.[IssueDatetime]) AS [DateVal]", "CONVERT(date, {alias}.[IssueDatetime])", new[] { "DateVal" }, new IType[] { NHibernateUtil.Date })) 
     .Add(Projections.Sum("Tax"), "TotalFare")) 
    .List(); 

Le code SQL suivant est généré.

SELECT CONVERT(date, this_.[IssueDatetime]) AS [DateVal], sum(this_.Tax) as y1_ FROM IgnoreTime_Record this_ GROUP BY CONVERT(date, this_.[IssueDatetime]) 
+1

En faisant cela, vous vous attachez à la fois le schéma (c.-à-rupture si vous renommez une colonne) et le SGBD –

+0

Merci pour les heads up, Je n'étais pas au courant de cette méthode. En l'exécutant sur SQL Server, cependant, j'obtiens cette erreur. "Le dialecte actuel NHibernate.Dialect.MsSql2005Dialect ne supporte pas la fonction: date" –

+0

C'est bizarre, c'est défini même pour MsSql2000. Quelle version NH utilisez-vous? (la dernière stable est 3.0.0) –