2009-08-12 1 views
3

На моем сайте люди могут покупать запчасти для автомобилей. Я хочу создать отчет для клиента, чтобы узнать, сколько он потратил на части в месяц на сайте, и позволить им фильтровать по дате. Если бы я писал ее в SQL, я написал бы так:Как использовать DatePart в запросе на уровень 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) 

Является ли этот запрос возможно даже в качестве критерия запроса в NHibernate?

ответ

4

Да есть способ:

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

Где «день» значение, которое вы хотели бы получить от даты («DateTimeProperty») и pvDay это день вы сравниваете его.

3

Некоторые люди думают о Criteria API как о современной замене для HQL. Это не может быть дальше от истины. API-интерфейс Criteria предназначен для использования в сценариях, где запрос должен строиться динамически. Для статических запросов, зачем наказывать себя? Просто используйте старый добрый API HQL (вы можете указать , parametrize), он поддерживает группировку и все, что вы на нее набрасываете.

Смежные вопросы