2011-06-30 13 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)); 

私はそれがまったく正しいとは思っていませんが、私が勉強しているものを示しています。 gを達成する。 SQL Serverをデータベースとして使用する。

答えて

3

SQLで直接クエリを作成する場合は、datepart関数を使用します。 This質問は、NHibernateからdatepart関数を呼び出すことについて問い合わせる。基本的にNHibernate投影法を使用します:Projections.SqlFunction。

複雑なことは、必要な細かさに応じて、1時間、1分、1秒の複数の投影を必要とすることです。また、datepartパラメータ(引用符で囲まれていない文字列定数)を渡す方法が見つからないため、datepartを直接呼び出す方法が見つかりませんでした。代わりに、あなたはそうのような方言を拡張することができます。

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

EDIT: 私は、クエリのパフォーマンスのノートを取ることが警告します。時間帯に索引がないため、日付列に索引がある場合でも、レコードが多数あり、これが制限されている唯一の列であると、照会のパフォーマンスが低下する可能性があります。この場合、時間/分の明示的な列を追加する方がよい場合があります。

1

いつでもすべての結果を12:15:00から2:20:00の間に欲しいと思っていますか?

私はこれが完璧な答えだとは思わないが、私の最初の考えは、それがある日(例えば、深夜からの時間/分/秒)に別の列(おそらく計算されたもの)あなたの粒度)。

これを投稿のタイムスパンとしてマップし、それをフィルタすることができます。

関連する問題