我有以下查询:
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语句,也不再有异常。
好的,找到了解决方案。映射等没有错,只是LINQ查询如何转换为SQL。特别是,这一行是如何翻译的:
&& item.IsActive == true
不知怎的,这被转换成复杂的CASE语句,最终导致异常消息。然而,== true
-部分并不是真正必要的。通过删除它,翻译器不再感到困惑,并提供正确的SQL:
factuurite0_.IsActive=1
不再有CASE语句,也不再有异常。
在调试级别使用Log4Net?在某些版本的Hibernate和Log4Net中,在DEBUG级别打开日志时存在不兼容。您得到的只是关于"无法执行sql无法将布尔值转换为字符串"的错误。试着把你的日志级别调高到INFO,这个问题就会消失。