2009-08-12 7 views
3

Sur mon site, les gens peuvent acheter des pièces pour véhicules. Je veux créer un rapport pour un client pour voir combien il a dépensé en pièces par mois sur le site, et lui permettre de filtrer par date. Si je l'écrivais dans SQL, je voudrais écrire ceci:Comment utiliser DatePart dans une requête de critères NHibernate

SELECT 
    v.id, 
    DATEPART(YEAR, o.order_date), 
    DATEPART(MONTH, o.order_date), 
    SUM(i.unit_price * i.quantity) 
FROM vehicles v 
    join order_items i on v.id = i.truck_id 
    join orders o on o.order_id = i.order_id 
WHERE v.customer_id = @CustomerId 
    AND o.order_date > @StartDate 
    AND o.order_date < @EndDate 
GROUP BY DATEPART(YEAR, o.order_date), DATEPART(MONTH, o.order_date) 

Est-ce même possible requête comme une requête de critères dans NHibernate?

Répondre

4

Oui, il y a un moyen:

CurrentSession.CreateCriteria(typeof(Object)).Add(Expression.Eq(Projections.SqlFunction("day", NHibernateUtil.DateTime, Projections.Property("DateTimeProperty")), pvDay)) 

Où « jour » est la valeur que vous souhaitez obtenir de la date (« DateTimeProperty ») et pvDay est le jour où vous vous comparez à.

3

Certaines personnes pensent que l'API Criteria est un remplacement moderne de HQL. Cela ne peut pas être plus éloigné de la vérité. L'API Criteria est destinée à être utilisée dans des scénarios où la requête doit être générée dynamiquement. Pour les requêtes statiques, pourquoi vous punir? Il suffit d'utiliser le bon vieux HQL API (peut le paramétrer), il supporte le groupement et tout ce que vous lui lancez.

Questions connexes