NHibernate.Linq - Ошибка запроса при использовании Nullable типов в предложении Where - PullRequest
1 голос
/ 01 марта 2012

У меня следующий запрос 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 голосов
/ 12 февраля 2014

Я думаю, что самый ясный способ выразить это, что NHibernate обрабатывает, это:

From eachLine In myNhSession.Query(Of SamplePoco)()
     Where eachLine.SampleIntField.HasValue AndAlso eachLine.SampleIntField.Value = 1234
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...