2014-12-02 47 views
1

我有一個日期時間字段CreatedOn的表。我想獲取所有記錄的日期時間字段(CreatedOn)的分是31和59之間,我想獲得的NHibernate相當於NHibernate從日期字段根據分鐘選擇查詢

SELECT * FROM dbo.CL_M_Organization 
WHERE DATEPART(mi,CreatedOn) BETWEEN 31 AND 59 

基本NHibernate的查詢是

var result = NHSession.QueryOver<Organization>() 
.Where(x=>x.CreatedOn < currentdatetime) 
.List<Organization>() 
.ToList(); 

字段CreatedOn是datetime類型的。

任何人都請幫助...

+1

你爲什麼要這麼做?看起來你正在試圖解決可能以不同方式完成的事情。您可能必須執行原始SQL查詢並使用NHibernate將結果轉換爲對象。 – Origin 2014-12-02 11:13:38

+0

但創建日期時間屬性?如果是這樣,它不應該是CreatedOn.Minute? – 2014-12-02 11:21:27

+0

'分鐘'是'DateTime'的一個屬性,我懷疑NHibernate能夠正確執行那個反射。在能夠查詢屬性之前,它可能必須從數據庫中提取結果。 – Origin 2014-12-02 11:35:28

回答

3

如果你正在使用NHibernate的是舊版本,你可以使用MinutePart擴展方法(在NHibernate.Criterion命名空間中找到),與IsBetween擴展方法一起:

var result = NHSession.QueryOver<Organization>() 
    .Where(x => x.CreatedOn.MinutePart().IsBetween(31).And(59)) 
    .List<Organization>() 
    .ToList(); 

但是,如果您使用的是更新版本的NHibernate(> = 4),則應該直接使用DateTime.Minute屬性。 NHibernate的會理解你正在試圖做的,它正確地翻譯成SQL什麼:

var result = NHSession.QueryOver<Organization>() 
    .Where(x => x.CreatedOn.Minute.IsBetween(31).And(59)) 
    .List<Organization>() 
    .ToList(); 

這兩個將生成的SQL語句:

SELECT 
    /* All OrganizationUnit columns */ 
FROM 
    Temp this_ 
WHERE 
    datepart(minute, this_.CreatedOn) between 31 and 59; 
+0

感謝您對此的回答。我感到驚喜的是NHibernate對此有支持。 – Origin 2014-12-03 09:22:50

相關問題