【问题标题】:nHibernate 3 - QueryOver with DateTimenHibernate 3 - QueryOver 与 DateTime
【发布时间】:2011-01-23 05:28:40
【问题描述】:

我正在尝试编写一个查询以使用 DateTime 进行选择。年份作为 where 参数,但我从 nunit 收到此错误:

NHibernate.QueryException:无法解析属性:Register.Year of:Estudantino.Domain.Events

Events 类中,我有一个名为 Register 的属性作为 DateTime 类型。

public virtual DateTime Registada { get; set; }

这是返回错误的方法:

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

变量year的类型是int,它被传递给方法。

有人知道我做错了什么吗?我的数据库服务器是 SQL Server 2005 Express。

【问题讨论】:

    标签: nhibernate nhibernate-3


    【解决方案1】:

    QueryOver 无法解决 DateTime.Year 之类的问题。

    改用 LINQ:

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

    【讨论】:

    • 这会访问数据库并检索所有记录,对吧?
    • @JWLim 没有。它被翻译成 sql 执行。
    • 啊,我不知道 Query 是 NHibernate 的 LINQ 提供者。我大多只使用 HQL 和 QueryOver。谢谢!
    【解决方案2】:

    在 QueryOver 中,你可以说:

    dateTimeColumn.YearPart() == 1999
    

    还有其他的扩展方式:MonthPart()DayPart()

    【讨论】:

      【解决方案3】:

      您可能需要在此处改用 HQL。基本上 NHibernate 并不知道如何处理year。我怀疑您需要使用RegisterFunction 来注册YEAR 函数。

      请完整阅读此article,以完全了解您要执行的操作。

      1. 在代码中创建自定义方言
      2. 在 SQL Server 中创建一个名为 MyYearFunction 的函数,该函数返回日期的年份
      3. 然后使用HQL(不确定QueryOver是否可以这样做)获取日期where dbo.MyYearFunction(:date) = 12" ...

      【讨论】:

      • year 已为大多数方言注册,并由当前的 LINQ 提供程序处理,没有问题。
      • 啊,谢谢 Diego,我不知道这个。你每天都会学到一些东西
      【解决方案4】:

      .Where(x => x.Register >= new DateTime(year, 1, 1) && x.Register

      【讨论】:

      • 我不能这样使用 DateTime,它返回一个 QueryException。
      • 如果x.Register 的类型为System.DateTime,这将起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多