使用NHibernate4和Oracle 12進行操作。 NHibernate配置爲使用Oracle10gDialect。NHibernate - 根據服務器日期選擇記錄
第一個相關的代碼。
public class WorkOrder
{
........
public virtual DateTime CreationDate {get; set;}
........
}
CreationDate映射爲:
Map(x => x.CreationDate)
.Column("CREATION_DATE")
.CustomType("DateTime")
.Access.Property()
.Generated.Never()
.CustomSqlType("DATE")
.Not.Nullable();
查詢樣品:
var workOrders1 = session.Query<WorkOrders>()
.Where(p => DateTime.Today.Date.Equals(p.CreationDate.Date))
.ToList();
var workOrders2 = session.Query<WorkOrders>()
.Where(p => p.CreationDate.Date == DateTime.Today.Date)
.ToList();
var workOrders3 = session.Query<WorkOrders>()
.Where(p => p.CreationDate.Date.Equals(DateTime.Today.Date))
.ToList();
上述所有LINQ查詢轉換爲SQL這樣的:
select workorders0_.CREATION_DATE as CREATION11_
from APPS.WORK_ORDERS workorders0_
where TIMESTAMP '2016-04-16 00:00:00' /* :p0 */ = trunc(workorders0_.CREATION_DATE)
這些查詢使用客戶端計算機系統時間(和作爲參數),而不是服務器系統時間。我總是喜歡使用服務器時間。對於我正在處理的oracle數據庫,我更喜歡「sysdate」,因爲在使用「sysdate」函數插入觸發器之前設置的「CreationDate」字段。
NHibernate可以直接使用服務器的日期時間嗎?並且不需要參數。像:
select workorders0_.CREATION_DATE as CREATION11_
from APPS.WORK_ORDERS workorders0_
where trunc(sysdate) = trunc(workorders0_.CREATION_DATE)
作爲總結,「其中」部分必須從第一個改爲第二個。 NHibernate的版本是v4.0.30319
where TIMESTAMP '2016-04-16 00:00:00' /* :p0 */ = trunc(workorders0_.CREATION_DATE)
where trunc(sysdate) = trunc(workorders0_.CREATION_DATE)
謝謝你很多。但我得到NHibernate.dll中發生類型'System.NotSupportedException'的未處理的異常 其他信息:PartialEvalException(NotImplementedException(「該方法或操作未實現。「),PartialEvalException(NotImplementedException(」該方法或操作沒有實現。「),GetSysDate())。Date) 我搜索了這個方法,它必須工作,我做了一些測試,不同的oracledialects什麼都沒有改變 – ayocak
現在做我自己的測試,是的,它看起來這個擴展屬性不支持參數較少的功能......很不幸,我可以調用任何具有參數的函數,包括用戶定義的函數(包括他們的名字中的模式)。通過添加一個具有虛擬參數的用戶定義的函數來調用參數較少的函數,但我仍然在尋找更好的解決方案,看起來它必須在某個映射的實體屬性上調用,相當大的一個限制 –
我還沒有找到任何更好的方法。我已經更新了我的回答。 –