2011-07-06 17 views
6

Ben oldukça alelâde QueryOver sorgu aşağıdaki içeren,Truncate DateTime NHibernate içinde QueryOver SelectGroup

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

ancak beklendiği gibi şimdi kesilmiş Tarihe göre grubuna bir gereksinim var çalışır Bu sorgu Bu nesneler için bazı Tarihler bir zaman bileşeni içerebilir. Bu önemsiz bir değişiklik olmalı gibi görünüyor ama NHibernate tarafından desteklenen bir yol bulamıyorum.

Açık çözüm, aşağıdaki değişiklik olabilir, ancak desteklenmez.

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

Herhangi bir fikir?

Teşekkür

cevap

4

Sizin QueryOver aşağıdaki gibi görünebilir:

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

Çıktı (sözde sql): Bu, şerefe yardımcı

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

Umut!

+0

Çok teşekkürler, MonkeyCoder. Projeksiyonlarla birlikte SelectList() /. SelectGroup() kullanmayı denedim, ancak başarısız oldu. – shatl

0

Sorgularda, tarihi (tarih yerine) kullanabilmek için haritanıza bir yardımcı özellik eklemek isteyebilirsiniz.

Burada benim kodumdan bir örnek; Bir ondalık değeri kullanır, ancak bu herhangi bir alt sorgu ile çalışıyor:

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

fluentNHibernate haritası:

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

emin olun modeli sınıfı bu özelliği vardır

, bir formül eşlenmesi formül() parantezleri arasında koymak için.

Formülünüzde, datetime tarihini bir tarihe çeviren bir seçim sorgusu yaparsanız, bu özelliğe göre bu özelliğe göre gruplayabilirsiniz.