如何在NHibernate Criteria Query中使用DatePart

时间:2009-08-12 19:30:41

标签: nhibernate

在我的网站上,人们可以购买汽车零件。我想为客户创建一份报告,以了解他们每月在网站上花费的金额,并允许他们按日期过滤。如果我是用SQL编写的,我会写这个:

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)

这个查询甚至可以作为NHibernate中的Criteria查询吗?

2 个答案:

答案 0 :(得分:4)

是的,有办法:

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

其中“day”是您希望从日期获得的值(“DateTimeProperty”),而pvDay是您将其与之比较的日期。

答案 1 :(得分:3)

有些人认为Criteria API是HQL的现代替代品。这不可能是事实。 Criteria API旨在用于必须动态构建查询的场景。对于静态查询,为什么要惩罚自己?只需使用优秀的旧HQL API(可以参数化它),它确实支持分组以及您抛出的任何其他内容。