У меня следующий запрос:
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 и больше нет исключений.