c# - NHibernate 标准按一天中的时间搜索

标签 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作为数据库。

最佳答案

如果您要直接在 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)"));
        }
    } 

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

关于c# - NHibernate 标准按一天中的时间搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6540077/

相关文章:

c# - FluentNHibernate 自动映射 "no persister for"

nhibernate - NHibernate 上关于 Entity Framework 的导航属性是否有类似的东西?

c# - 为什么我不能将 List<T> 传递给通用构造函数参数,尽管所有约束都已满足?

c# - 错误的连接字符串 NHibernate 3.3

c# - 由于在输出窗口中输出类型名称导致调试缓慢

c# - 'MapPath' 方法在其过程移至 C# 类文件后立即停止工作

c# - 流利的 NHibernate : ManyToMany Self-referencing mapping

c# - 在 CoreCLR 中运行 F#

c# - 从字符串中删除特定的特殊字符

C# 错误 - "Not all code paths return a value"