有人可能会指出为什么会发生这种情况:
我正在使用NHibernate
和Linq
提供商。
此处列出了失败的代码:
var sequence = session.Query<T>();
var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);
调试显示sequence
(此为IQueryable<T>
)之后包含2个元素,这些元素已添加到数据库中。
我希望第一个Where
语句产生该序列中的所有元素,但不幸的是它会留下0个元素。
相反,第二个Where
语句实际上产生了两个元素,因为它应该起作用。
以下是第一个和第二个NHibernate -> Sqlite
语句的Where
个查询。
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0='true';@p0 = 'True' [Type: String (0)]
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)]
现在,如果我使用我的InMemoryRepository
测试相同的代码,(x => true)
将每个实体存储在一个简单的列表中,NHibernate
绝对可以正常工作。
那么 - 为什么在使用{{1}}时会发生这种情况?这是一个错误还是我做错了什么?
谢谢。
答案 0 :(得分:5)
我不知道NHibernate,但问题从生成的SQL中显而易见:您的数据库不认为true(小写t)等于True(大写T)。在SQL Server中,您可以通过修改数据库排序规则来更改此设置(除非您因其他原因需要不区分大小写,否则这是一个非常糟糕的主意。)
我猜这是你需要解决的NHibernate中的一个错误。测试t => 1 == 1
而不是t => true
,这可能会起作用,具体取决于NHibernate代码的编写方式。
答案 1 :(得分:2)
我的猜测是,这是NHibernate中基于您显示的SqLite输出的错误。您可以尝试X => X.Id == X.Id
而非X => true
,看看是否有效。
答案 2 :(得分:1)
对我来说看起来像个错误。它将布尔操作转换为字符串评估,甚至搞砸了,因为它使用true
设置查询并使用True
进行评估,因此区分大小写的测试将失败。