NHibernate标准按时间搜索

本文关键字:搜索 时间 标准 NHibernate | 更新日期: 2023-09-27 18:00:43

我正在尝试创建一个NHibernate标准,该标准将为我提供在一天中某个时间创建的所有帖子。例如,我想要在12:15:00和2:2:00之间创建的所有帖子。

帖子看起来像这个

public class Post
{
   public virtual DateTime CreatedOn { get; set;}
}

映射:

<class name="Post" table="Posts">
   <property name="CreatedOn" not-null="true"/>
</class>

我想使用DetachedCriteria(这将是更大搜索的一部分)类似于:

var criteria = DetachedCriteria.For<Post>
               .Add(Restriction.Ge("CreatedOn", Time(12, 15, 00))
               .Add(Restriction.Le("CreatedOn", Time(2, 20, 00));

我知道这一点都不正确,但这表明了我正在努力实现的目标。使用SQL Server作为数据库。

NHibernate标准按时间搜索

如果要直接在SQL中创建查询,则需要使用datepart函数。这个问题询问如何从NHibernate调用datepart函数。基本上你使用NHibernate投影:Projections.SqlFunction.

使事情稍微复杂一点的是,您需要有多个投影,一个用于小时、分钟和秒(取决于您需要的粒度)。此外,我还没有找到直接调用datepart的方法,因为我找不到传递datepart参数(它是一个无引号的字符串常量)的方法。相反,你可以这样扩展方言:

  public class MsSql2008ExtendedDialect : MsSql2008Dialect
    {
        public MsSql2008ExtendedDialect()
        {
            RegisterFunction("DATEPART_HOUR", new SQLFunctionTemplate(NHibernateUtil.DateTime, "datepart(hh, ?1)"));
        }
    } 

编辑:不过,我要提醒您注意查询性能。由于一天中的时间没有索引,即使日期列有索引,如果有许多记录,并且这是唯一受限制的列,查询性能也可能受到影响。在这种情况下,最好为小时/分钟添加显式列。

我假设您希望在任何一天的12:15:00到2:2:00之间得到所有结果?

我认为这不是一个完美的答案,但我的第一个想法是创建另一个列(也许是一个经过计算的列),其中包含一天中的时间(例如,从午夜开始的小时/分钟/秒,具体取决于您的粒度)。

您可以将此映射为Post中的时间跨度,并对其进行筛选。