我有以下查询:
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中的字符串,但它无法做到。
修改
好的,找到了解决方案。映射等没有错,只是将LINQ查询转换为SQL。特别是,如何翻译这一行:
&& item.IsActive == true
不知何故,这会被转换为复杂的CASE语句,最终导致异常消息。但是,== true
- 部分并不是必需的。通过删除它,翻译器不再混淆并提供正确的SQL:
factuurite0_.IsActive=1
不再有CASE声明,也不再有例外。
答案 0 :(得分:2)
好的,找到了解决方案。映射等没有错,只是将LINQ查询转换为SQL。特别是,如何翻译这一行:
&& item.IsActive == true
不知何故,这会被转换为复杂的CASE语句,最终导致异常消息。但是,== true
- 部分并不是必需的。通过删除它,翻译器不再混淆并提供正确的SQL:
factuurite0_.IsActive=1
不再有CASE声明,也不再有例外。
答案 1 :(得分:0)
在调试级别使用Log4Net?在某些版本的Hibernate和Log4Net中,在DEBUG级别打开日志记录时存在不兼容性。所有你得到的是关于&#39;无法执行sql的错误无法将boolean转换为字符串&#39;。尝试将您的日志记录级别调高为INFO,问题应该消失。