nHibernate не может привести Boolean к String - PullRequest
2 голосов
/ 26 мая 2011

У меня следующий запрос:

var query = from item in Session.Query<FactuurItem>()
    where item.EnergieType == etype
    && (item.DienstType == null || item.DienstType == DienstType.Onbekend || item.DienstType == dtype)
    && item.IsActive == true
    orderby item.Naam
    select item;

, который преобразуется в следующий SQL:

select * from [FactuurItem] factuurite0_ 
where 
    factuurite0_.EnergieType=? 
    and (factuurite0_.DienstType is null or factuurite0_.DienstType=? or factuurite0_.DienstType=?) 
    and case when factuurite0_.IsActive=1 then 'true' else 'false' end=case when ?='true' then 'true' else 'false' end 
order by factuurite0_.Naam asc

, что приводит к исключению:

{"Unable to cast object of type 'System.Boolean' to type 'System.String'."}

Теперь на мой вопрос: почему ??

Исходный запрос выглядит нормально для меня.SQL, однако, нет.Откуда берутся два случая?По-видимому, он пытается преобразовать свойство IsActive в строку в SQL, чего не может сделать.

EDIT

Хорошо, найдено решение.Нет ничего плохого в отображении и т. Д., Только в том, как запрос LINQ переводится в SQL.В частности, как эта строка переводится:

&& item.IsActive == true

Каким-то образом это переводится в сложный оператор CASE, который в конечном итоге приводит к сообщению об исключении.Однако, == true -часть на самом деле не нужна.Удалив его, переводчик больше не запутывается и выдает правильный SQL:

factuurite0_.IsActive=1

Больше нет оператора CASE и больше нет исключений.

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Хорошо, нашел решение.Нет ничего плохого в отображении и т. Д., Только в том, как запрос LINQ переводится в SQL.В частности, как эта строка переводится:

&& item.IsActive == true

Каким-то образом это переводится в сложный оператор CASE, который в конечном итоге приводит к сообщению об исключении.Однако, == true -часть на самом деле не нужна.Удалив его, переводчик больше не запутывается и выдает правильный SQL:

factuurite0_.IsActive=1

Больше нет оператора CASE и больше нет исключений.

0 голосов
/ 01 мая 2015

Использование Log4Net на уровне отладки?В некоторых версиях Hibernate и Log4Net имеется несовместимость при включении ведения журнала на уровне DEBUG.Все, что вы получаете, это ошибка о том, что «невозможно выполнить SQL не может привести логическое значение к строке».Попробуйте увеличить уровень регистрации до INFO, и проблема должна исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...