我正在尝试创建一个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作为数据库。
答案 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中的时间跨度并对其进行过滤。