NHibernate标准按时间搜索

时间:2011-06-30 19:28:58

标签: c# nhibernate

我正在尝试创建一个NHibernate标准,它将获取我在一天中某个时间创建的所有帖子。 例如,我想要在12:15:00和2:20: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作为数据库。

2 个答案:

答案 0 :(得分:3)

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

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

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

修改 但是请注意查询性能。由于时间上没有索引,即使日期列上有索引,如果有许多记录,查询性能也会受到影响,这是唯一受限制的列。在这种情况下,最好为小时/分钟添加显式列。

答案 1 :(得分:1)

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

我不相信这是一个完美的答案,但我的第一个想法是创建另一个列(可能是一个计算的列),它的时间是一天(例如,午夜后的小时/分钟/秒取决于你的粒度)。

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