2011-02-08 46 views
8

可能有人指出,这可能是为什么发生的事情:C#奇怪拉姆达行为

我使用NHibernateLinq提供它。

失败此处列出的代码:

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个元素。

(WHY ???)

第二Where语句,相反,实际上产生2种元素作为它应该工作。

以下是对第一个和第二个Where语句的NHibernate -> Sqlite查询。

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)工作absolutelty罚款。

所以 - 为什么在使用NHibernate时会发生这种情况?这是一个错误还是我做错了什么?

谢谢。

+2

这很可能与NHibernate处理它从lambda创建的Expression的方式有关,尽管善良知道它在做什么...... – Massif 2011-02-08 15:04:56

回答

5

我不知道NHibernate,但问题是显而易见的从生成的SQL:您的数据库不认为真(小写字母t)等于真(大写字母T)。在SQL服务器中,你可以通过修改数据库排序规则来改变它(这是一个非常糟糕的主意,除非你想因其他原因不区分大小写)。

我的猜测是这是NHibernate中的一个错误,需要解决。测试t => 1 == 1而不是t => true,这可能工作取决于如何编写NHibernate代码。

+1

同意。并请在http://jira.nhforge.org打开一张票 – 2011-02-08 16:13:38

2

我的猜测是,这是基于您显示的SqLite输出的NHibernate中的一个错误。你可以尝试X => X.Id == X.Id而不是X => true,看看是否有效。

1

看起来像一个bug给我。它将布尔操作转换为字符串评估,甚至搞砸了,因为它使用true设置查询并使用True进行评估,因此区分大小写的测试将失败。