2011-03-21 10 views
2

私はNHibernate-drivenリポジトリ、Fluentマッピングを使用しており、Linq to NHibernateを使用しようとしています。C#NHibernate Simple Question

しかし、この

Retrieve<XValue>(x => (x.Timestamp.CompareTo(start) >= 0 && 
         x.Timestamp.CompareTo(end) <= 0)); 

// 'Retrieve' here acts simply as 'session.Query<T>().Where(expression);' 

のようないくつかの単純なクエリのために私は次のような結果を得る:私はなぜ知らないが、CompareTo操作はに投影されていない

System.NotSupportedException: Int32 CompareTo(System.DateTime) 

をデータベースと出力も奇妙です。

create table "QuotUnitDescriptor" (
    Id integer, 
    PaperId INTEGER, 
    Timestamp DATETIME, 
    InPaperIdx INTEGER, 
    primary key (Id) 
) 

NHibernate: INSERT INTO "QuotUnitDescriptor" ...................... 

// Many INSERT's 

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ 
    from "QuotUnitDescriptor" binaryunit0_ 

この操作でselect -> integer操作が呼び出される理由を理解できません。

次の日付指向のクエリはどのように実装する必要がありますか?Linqを使用する方が良いですが、基準も良いと思います)。

+0

タイムスタンプと0を比較しています。その理由は何でしょうか? – Vadim

+0

@ Yads私はそれを私のコードの 'start'と' end'タイムスタンプと比較しています。 –

答えて

5

NHibernate.LinqプロバイダーがCompareTo呼び出しをsqlに変換できません。

使用何かのように:

Retrieve<XValue>(x => x.Timestamp>start && x.Timestamp<end); 

P.S.リポジトリは避けてください。それは素朴な抽象です。

+0

ありがとうございます。リポジトリに関するあなたの声明をコメントしてください。それらの代わりにどのような抽象化を使うべきですか?よりドメイン固有のもの –

+1

@ Yippie-Kai-Yay NHibernateを使用している場合は、抽象化しないでください。あなたはそれをあなたと結びつけたいと思っていることを確かめてください。より深いオブジェクトグラフやパフォーマンスの問題に直面するまで、それはうまくいくようです(リポジトリの使用法)。あなたのアプリケーションの退屈な '読み込み '側を抽象化しようとするよりも、状態の変化を適切に検証する豊富なドメインモデルを確保することがより有益です。 http://ayende.com/Blog/archive/2011/03/16/architecting-in-the-pit-of-doom-the-evils-of-the.aspx –