Sqlite nHibernate 3.0.0.4000在查询中以不同的方式处理布尔值?

Sqlite nHibernate 3.0.0.4000在查询中以不同的方式处理布尔值?,sqlite,nhibernate,Sqlite,Nhibernate,我刚刚将nHibernate从版本3.0.0.1002更新为3.0.0.4000。当我这么做的时候,我的许多查询开始失败。其中一个问题是: var items = (from b in session.Query<InvoiceDetail>() where b.Customer == AddressedToCustomer && b.IsCreditNote == !addInvoices

我刚刚将nHibernate从版本3.0.0.1002更新为3.0.0.4000。当我这么做的时候,我的许多查询开始失败。其中一个问题是:

var items = (from b in session.Query<InvoiceDetail>() 
                            where b.Customer == AddressedToCustomer && b.IsCreditNote == !addInvoices 
                            orderby b.DueDate , b.InvoiceNumber 
                            select b).ToList(); 
var items=(来自session.Query()中的b)
其中b.Customer==AddressedToCustomer&&b.IsCreditNote==!addInvoices
订货人b.DueDate,b.InvoiceNumber
选择b).ToList();
3.0.0.1002中生成的SQL:

2011-02-17 15:55:43612调试选择 invoicedet0.Id作为Id3, 发票编号0 \发票编号为 发票2\u 3\u, 发票编号0\文件编号为 文件3\u 3\u, 发票日期0\单据日期为 文件4\u 3\u,发票日期为 杜达特3(Duedate 3), 发票详情如下 第6部分第3部分,发票金额 正如我所见, 发票编号0_uu0.IsCreditNote as IsCredit8_3_, 发票原始金额为 原始发票,发票金额为 金额3,发票编号0,发票编号为LRNo3, 发票日期0.LRDate为LRDate3, 发票由as发出 发票日期13天,发票日期0天 作为贷记日, invoicedet0\u0.CustomerId为 来自发票详细信息的客户3 发票编号0_uu其中 ((invoicedet0.CustomerId为空)和 (@p0为空)或 invoicedet0_u0.CustomerId=@p0)和大小写 当invoicedet0_u0.IsCreditNote=1时,则 1否则0结束=当@p1=1时的情况,然后1 否则0结束订单 发票日期0_uuDateASC, 发票编号asc@p0= 101790[类型:Int32(0)],@p1=False [类型:Int32(0)]

在3.0.0.4000中生成的SQL:

2011-02-17 16:22:15275调试选择 invoicedet0.Id作为Id3, 发票编号0 \发票编号为 发票2\u 3\u, 发票编号0\文件编号为 文件3\u 3\u, 发票日期0\单据日期为 文件4\u 3\u,发票日期为 杜达特3(Duedate 3), 发票详情如下 第6部分第3部分,发票金额 正如我所见, 发票编号0_uu0.IsCreditNote as IsCredit8_3_, 发票原始金额为 原始发票,发票金额为 金额3,发票编号0,发票编号为LRNo3, 发票日期0.LRDate为LRDate3, 发票由as发出 发票日期13天,发票日期0天 作为贷记日, invoicedet0\u0.CustomerId为 来自发票详细信息的客户3 发票编号0_uu其中 invoicedet0\u0.CustomerId=@p0和case 当invoicedet0_u0.IsCreditNote=1时,则 'true'否则'false'结束=当 @p1='true'然后'true'否则'false' 按发票日期0结束订单, 发票编号asc@p0= 101790[类型:Int32(0)],@p1= “False”[类型:字符串(0)]

我使用约定将布尔值转换为整数(true=1,false=0)。以前的版本正在进行此转换,而较新的版本则没有。bool在较新版本中转换为字符串,但应根据约定将其转换为int

从生成的SQL:
“!addInvoices”在sql查询中作为字符串传递,在早期版本中作为int传递:
3.0.0.1002:@p1=True[类型:Int32(0)]
3.0.0.4000:@p1='True'[类型:字符串(0)]

此外,IsCreditNote数据库字段与新版本中的“true”和“false”进行比较,并与旧版本中的1和0进行比较

其次,即使我删除了约定,这也是3.0.0.4000中两个不同命令的输出:
插入:

2011-02-20 10:18:22977调试插入 进入发票详细信息(发票编号, 文件编号、文件日期、截止日期、, 分区详细信息,IsInvoice, IsCreditNote,OriginalAmount,Amount, LRNo,LRDate,发送人:, CreditDays,CustomerId)值(@p0, @p1、@p2、@p3、@p4、@p5、@p6、@p7、, @p8、@p9、@p10、@p11、@p12、@p13); 选择最后一个插入行ID()@p0= 9070183358[类型:Int64(0)],@p1= 28592879[类型:Int64(0)],@p2= '20110210'[类型:字符串(0)],@p3= '20110303'[类型:字符串(0)],@p4= NULL[类型:字符串(0)],@p5=True [类型:布尔值(0)],@p6=False [类型:布尔值(0)],@p7=2685[类型: 十进制(0)],@p8=2685[类型: 十进制(0)],@p9=NULL[类型:字符串] (0)],@p10=NULL[类型:字符串(0)], @p11=NULL[类型:字符串(0)],@p12= 21[类型:Int32(0)],@p13=101760 [类型:Int32(0)]

更新:

2011-02-20 10:10:13941调试选择 invoicedet0.Id作为Id3, 发票编号0 \发票编号为 发票2\u 3\u, 发票编号0\文件编号为 文件3\u 3\u, 发票日期0\单据日期为 文件4\u 3\u,发票日期为 杜达特3(Duedate 3), 发票详情如下 第6部分第3部分,发票金额 正如我所见, 发票编号0_uu0.IsCreditNote as IsCredit8_3_, 发票原始金额为 原始发票,发票金额为 金额3,发票编号0,发票编号为LRNo3, 发票日期0.LRDate为LRDate3, 发票由as发出 发票日期13天,发票日期0天 作为贷记日, invoicedet0\u0.CustomerId为 来自发票详细信息的客户3 发票编号0_uu其中 invoicedet0\u0.CustomerId=@p0和case 当invoicedet0_u0.IsCreditNote=1时,则 'true'否则'false'结束=当 @p1='true'然后'true'否则'false' 按发票日期0结束订单, 发票编号asc@p0= 107233[类型:Int32(0)],@p1='True' [类型:字符串(0)]

在Inserts中,传递的参数是布尔值(@p6),在Selects中,传递的参数是字符串(@p1)

问题是,我将此作为一个发布(实际上大部分内容都是从该问题线程复制的),但Patrick Earl将该问题作为一个非问题关闭。他说这是标准行为

在此版本之前的所有nHibernate版本的行为都正确。只有这一个表现不同。谁能评论一下这真的是一个bug,还是Patrick是正确的,我需要在我的数据库中解决这个问题

编辑:
我的数据库是SQLite,我正在使用Fluent nHibernate。

一些想法:

如果您使用的是SQL server,请将布尔值的列类型更改为位

尝试查询替换:
3.5.4. Query Language Substitution

You may define new NHibernate query tokens using query.substitutions. For example:
query.substitutions true=1, false=0
would cause the tokens true and false to be translated to integer literals in the generated SQL.
query.substitutions toLowercase=LOWER
would allow you to rename the SQL LOWER function.
var items = session.QueryOver<InvoiceDetail>()
        .Where(i => i.Customer == AddressedToCustomer)
        .And(i => i.IsCreditNote != addInvoices)
        .OrderBy(i => i.DueDate).Asc
        .ThenBy(i => i.InvoiceNumber).Asc
        .List();