2011-07-06 18 views
6

mam dość run-of-the-mill QueryOver zapytania zawierające następujące,Obetnij DateTime w NHibernate QueryOver SelectGroup

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

Ta kwerenda działa zgodnie z oczekiwaniami, jednak mam obecnie wymóg grupie przez ściętego Data ponieważ niektóre z dat dla tych obiektów mogą zawierać komponent czasu. Wygląda na to, że powinna to być drobna zmiana, ale nie mogę znaleźć sposobu, który jest obsługiwany przez NHibernate.

Oczywistym rozwiązaniem będzie zmiana poniżej, ale nie jest obsługiwana.

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

Wszelkie pomysły?

Dzięki

Odpowiedz

4

Twój QueryOver mógłby wyglądać następująco:

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

Output (pseudo SQL):

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

Nadzieja to pomaga, Pozdrawiam!

+0

Wielkie dzięki, MonkeyCoder. Próbowałem użyć SelectList() /. SelectGroup() z Projections, ale nie powiodło się. – shatl

0

Możesz chcieć dodać do mapy pomocnika, używając polecenia Formula, aby móc użyć daty (zamiast datetime) w zapytaniach.

Oto przykład z mojego kodu; wykorzystuje wartość dziesiętną, ale to działa dobrze z każdym podzapytaniu:

klasa model ma tę właściwość, aby być odwzorowane na wzorze:

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

FluentNhibernate mapy:

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

być pewny wstawić formułę między nawiasami().

Jeśli chcesz, aby formuła była kwerendą wybierania, która powoduje skrócenie datetime na datę, możesz zgrupować według tej właściwości w zapytaniu.