NHibernate.Linq - 在Where子句中Nullable类型时查询时出错

时间:2012-03-01 14:34:13

标签: vb.net linq nhibernate

我有以下NHibernate Linq查询:

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,则可以正常工作。似乎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

有什么建议可以保持简单吗?

1 个答案:

答案 0 :(得分:0)

我认为NHibernate处理的最明确的方法是:

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