Усечение DateTime в NHibernate QueryOver SelectGroup - PullRequest
6 голосов
/ 06 июля 2011

У меня довольно обычный запрос QueryOver, содержащий следующее:

.SelectList(list => list
    .SelectGroup(() => txn.GroupField)
    .SelectGroup(() => txn.Date))
.List<object[]>()

Этот запрос работает, как и ожидалось, однако теперь у меня есть требование сгруппировать по усеченной дате, поскольку некоторые из дат для этих объектов могут содержать компонент времени. Кажется, это должно быть тривиальным изменением, но я не могу найти способ, который поддерживается NHibernate.

Очевидным решением будет изменение ниже, но оно не поддерживается.

.SelectGroup(() => txn.Date.Date))

Есть идеи?

Спасибо

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Ваш QueryOver может выглядеть так:

Status alias = null;
var query = QueryOver.Of(() => alias)
    .Select(Projections.GroupProperty(
        Projections.SqlFunction("date", NHibernateUtil.Date, Projections.Property(() => alias.Date))));

Вывод (псевдо sql):

SELECT 
           ...
FROM       [Status] this_
GROUP BY   dateadd(dd, 0, datediff(dd, 0, this_.Date))

Надеюсь, это поможет, ура!

0 голосов
/ 12 декабря 2012

Возможно, вы захотите добавить вспомогательное свойство к вашей карте, используя команду Формула, чтобы иметь возможность использовать дату (вместо datetime) в запросах.

вот пример из моего кода; он использует десятичное значение, но это прекрасно работает с любым подзапросом:

класс модели обладает этим свойством, которое сопоставляется с формулой:

public virtual decimal Profit
{
    get { return this.SellPrice - this.Cost; }
    set { return; }
}

СвободноNHibernate карта:

//SellPrice and Cost are columns in the object's table
Map(v => v.Profit).Formula("(SellPrice - Cost)"); // this field is calculated, not read

обязательно поставьте формулу в скобках ().

Если вы сделаете свою формулу запросом выбора, который объединяет дату и время в дату, вы можете сгруппировать это свойство в своем запросе.

...