C#奇怪的lambda行为
有人能指出为什么会发生这种情况吗: 我正在为它使用C#奇怪的lambda行为,c#,linq,nhibernate,lambda,iqueryable,C#,Linq,Nhibernate,Lambda,Iqueryable,有人能指出为什么会发生这种情况吗: 我正在为它使用NHibernate和Linq提供程序 此处列出了失败的代码: 现在,如果我用我的InMemoryRepository测试相同的代码,它将每个实体存储在一个简单的列表中,(x=>true)工作得非常好 那么-为什么在使用NHibernate时会发生这种情况?这是一个bug还是我做错了什么? 谢谢。根据您显示的SqLite输出,我猜这是NHibernate中的一个bug。你可以试试 x= > x.id=x.id 而不是 x= > true ,看看
NHibernate
和Linq
提供程序
此处列出了失败的代码:
现在,如果我用我的
InMemoryRepository
测试相同的代码,它将每个实体存储在一个简单的列表中,(x=>true)
工作得非常好
那么-为什么在使用NHibernate
时会发生这种情况?这是一个bug还是我做错了什么?
谢谢。根据您显示的SqLite输出,我猜这是NHibernate中的一个bug。你可以试试<代码> x= > x.id=x.id 而不是<代码> x= > true <代码>,看看它是否有效。 我不知道NHiBernt,但问题是从生成的SQL中明显的:你的数据库不考虑真(小写T)等于true(大写T)。在SQL server中,您可以通过修改数据库排序规则来改变这一点(这是一个非常糟糕的主意,除非您出于其他原因需要区分大小写)
我猜这是NHibernate中的一个bug,你需要解决它。测试
t=>1==1
而不是t=>true
,这可能取决于NHibernate代码的编写方式。在我看来像个bug。它将布尔运算转换为字符串求值,甚至这也搞砸了,因为它使用true
设置查询并使用true
求值,因此区分大小写的测试将失败。这很可能与NHibernate处理它从lambda创建的表达式的方式有关,虽然天知道它在做什么。。。
var sequence = session.Query<T>();
var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);
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)]