2011-01-23 32 views
4

我想寫一個查詢來選擇使用DateTime。今年作爲其中的參數,但我收到此錯誤NUnit的:nHibernate 3 - 帶DateTime的QueryOver

NHibernate.QueryException : could not resolve property: Register.Year of: Estudantino.Domain.Events

在課堂活動我有一個名爲註冊作爲一個DateTime類型屬性。

public virtual DateTime Registada { get; set; } 

這是返回錯誤的方法:

using (ISession session = NHibernateHelper.OpenSession()) 
     { 
      return session.QueryOver<Evento>() 
       .Where(x => x.Register.Year == year) 
       .List(); 
     } 

變量今年是類型INT的,就是被傳遞給方法。

有沒有人知道我做錯了什麼?我的數據庫服務器是SQL Server 2005 Express。

回答

3

您可能需要在此處使用HQL。基本上NHibernate不知道如何處理year。我懷疑你需要使用RegisterFunction來註冊YEAR函數。

請完整閱讀此article以充分了解您正在嘗試做什麼。

  1. 在代碼中創建
  2. 定製方言創建一個名爲MyYearFunction SQL Server中的函數返回一個一年的日期
  3. 然後使用HQL(不知道QueryOver可以做到這一點)來獲得日期where dbo.MyYearFunction(:date) = 12" ...
+1

`年`已經註冊了大部分的方言,並由當前的LINQ提供商處理沒有問題。 – 2011-01-24 14:54:06

+0

啊,謝謝Diego,我不知道這個。你每天都會學到一些東西 – Rippo 2011-01-24 15:02:23

7

QueryOver不能解決諸如DateTime.Year之類的問題。

使用LINQ代替:

return session.Query<Evento>() 
       .Where(x => x.Register.Year == year) 
       .ToList(); 
+0

這會碰到數據庫並檢索所有記錄,對不對? – 2014-07-12 03:33:41

-1

。凡(X => x.Register> =新日期時間(年,1,1)& & x.Register < 新日期時間(年+ 1,1 ,1))

5

在QueryOver,你可以說:

dateTimeColumn.YearPart() == 1999 

還有其他的擴展方法:MonthPart()DayPart()