У меня следующий запрос 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
Какие-нибудь предложения, чтобы сделать это простым?