2011-06-30 25 views
2

我想創建一個NHibernate的標準,將讓我在一天中的某個時間創建的所有職位。 例如,我想要在12:15:00和2:20:00之間創建的所有帖子。NHibernate的標準搜索按日期時間

帖子是這樣

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作爲數據庫。

回答

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

我假設你想在任何一天的12:15:00和2:20:00之間獲得所有結果?

我不認爲這是一個完美的答案,但我的第一個想法是創建另一列(可能是一個計算的)與時間到它的一天(例如自午夜以來的小時/分鐘/秒取決於你的粒度)。

您可以將此映射爲Post中的時間範圍並對其進行過濾。