如何在NHibernate条件查询中使用DatePart

如何在NHibernate条件查询中使用DatePart,nhibernate,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 =

在我的网站上,人们可以购买汽车零件。我想为客户创建一个报告,以查看他们每月在站点上花费了多少零件,并允许他们按日期进行筛选。如果我是用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)
选择
v、 身份证,
日期部分(年份、订单日期),
日期部分(月、订单日期),
总额(i.单价*i.数量)
来自车辆v
在v.id=i.truck\U id上加入订单\项目i
在o.order\U id=i.order\U id上加入o
其中v.customer\u id=@CustomerId
订单日期>@StartDate
订单日期<@EndDate
按日期部分(年、订单日期)、日期部分(月、订单日期)分组

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

有些人认为条件API是HQL的现代替代品。这与事实相差甚远。CriteriaAPI旨在用于必须动态构建查询的场景中。对于静态查询,为什么要惩罚自己?只要使用好的旧HQLAPI(您可以对其进行参数化),它就支持分组和任何您抛出的东西

是的,有一种方法:

CurrentSession.CreateCriteria(typeof(Object)).Add(Expression.Eq(Projections.SqlFunction("day", NHibernateUtil.DateTime, Projections.Property("DateTimeProperty")), pvDay))
其中,“day”是您希望从日期(“DateTimeProperty”)中获得的值,而pDay是您将其与之进行比较的日期