我正在尝试创建一个 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/