2012-03-01 4 views
1

私は、次のNHibernateはLINQクエリを持ってどこで:NHibernate.Linq - エラー照会するときのNullable型の句

From eachLine In myNhSession.Query(Of SamplePoco)() 
    Where eachLine.SampleIntField = 1234 

プロパティSamplePoco.SampleIntFieldは、私は、クエリを実行すると、私は次の取得Nullable(Of Int32)

を入力しています例外:

System.InvalidCastException: Unable to cast object of type 'NHibernate.Hql.Ast.HqlCoalesce' to type 'NHibernate.Hql.Ast.HqlBooleanExpression'

私はInt32にプロパティの種類を変更した場合、それはWOR ks。 Nullable型は自動的にLinqコンパイラによって合体式に変換されるようです。

NHibernateをデバッグすると、このWhere句が{where ((eachLine.SampleIntField == 1234) ?? False)}に変換されたことがわかりました。私が理解できるように、全体の条件比較は、Nullableプロパティの代わりに合体されるように変換されました。

私はeachLine.SampleIntField.Equals(1234)それは同様に動作しません。このように配置する場合(例外は「実装されていません等しい」)

私は、次のコードにクエリを変更した場合、それは動作します:

From eachLine In myNhSession(Of SamplePoco)() 
    Where {1234}.Contains(eachLine.SampleIntField) 

(エレガントではない)

としてうまく機能別コード(私は最初のクエリで期待していたとして)適切にフィールドを合体:

From eachLine In myNhSession(Of SamplePoco)() 
Where If(eachLine.SampleIntField,0) = 1234 

それを簡単にするための提案はありますか?

+0

は、 'していますか?あなたは条件を組み合わせることができます。もちろん、これは自動化された感覚ではありません。 –

+0

はい、そうです。興味深いことに、C#の同等のLinqクエリはうまく動作します(私は質問を投稿した直後にテストを行っています)。 VB.NETのC#に対するファンとして、私は今かなり失望しています。( –

+0

これはいいです!(C#addict) –

答えて

0

私は、NHibernateのハンドルこと、それを置くために最も明示的に明確な方法を考えるには、次のとおりです。eachLine.SampleIntField.HasValue`がうまく翻訳どこ

From eachLine In myNhSession.Query(Of SamplePoco)() 
    Where eachLine.SampleIntField.HasValue AndAlso eachLine.SampleIntField.Value = 1234 
関連する問題