nHibernate无法将Boolean转换为String

时间:2011-05-26 11:41:45

标签: c# linq nhibernate

我有以下查询:

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声明,也不再有例外。

2 个答案:

答案 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,问题应该消失。