【问题标题】:NHibernate select query from date field based on MinuteNHibernate 从基于 Minute 的日期字段中选择查询
【发布时间】:2014-12-02 11:08:19
【问题描述】:

我有一个带有 CreatedOn 日期时间字段的表。我想获取日期时间字段 (CreatedOn) 的分钟在 31 到 59 之间的所有记录。我想获得与

等效的 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 字段的类型为日期时间。

请大家帮忙...

【问题讨论】:

  • 为什么要这样做?似乎您正在尝试解决可以以不同方式完成的事情。您可能必须执行原始 SQL 查询并使用 NHibernate 将结果转换为对象。
  • 但是 CreatedOn 是 DateTime 属性吗?如果是这样,不应该是 CreatedOn.Minute 吗?
  • MinuteDateTime 的属性,我怀疑 NHibernate 是否能够正确执行该反射。它可能必须先从数据库中提取结果,然后才能查询该属性。

标签: c# nhibernate queryover


【解决方案1】:

如果您使用的是旧版本的 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;

【讨论】:

  • 感谢您对此的回答。我很高兴 NHibernate 对此提供支持。
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多