2011-01-23 81 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()