nHibernate无法将布尔值强制转换为字符串

本文关键字:转换 字符串 布尔值 nHibernate | 更新日期: 2023-09-27 17:57:54

我有以下查询:

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语句,也不再有异常。

nHibernate无法将布尔值强制转换为字符串

好的,找到了解决方案。映射等没有错,只是LINQ查询如何转换为SQL。特别是,这一行是如何翻译的:

&& item.IsActive == true

不知怎的,这被转换成复杂的CASE语句,最终导致异常消息。然而,== true-部分并不是真正必要的。通过删除它,翻译器不再感到困惑,并提供正确的SQL:

factuurite0_.IsActive=1

不再有CASE语句,也不再有异常。

在调试级别使用Log4Net?在某些版本的Hibernate和Log4Net中,在DEBUG级别打开日志时存在不兼容。您得到的只是关于"无法执行sql无法将布尔值转换为字符串"的错误。试着把你的日志级别调高到INFO,这个问题就会消失。