【问题标题】:C# strange lambda behaviorC# 奇怪的 lambda 行为
【发布时间】:2011-06-23 12:12:44
【问题描述】:

有人可以指出为什么会发生这种情况:

我正在使用NHibernateLinq 提供程序。

这里列出了失败的代码:

var sequence = session.Query<T>();

var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);

调试显示sequence(即IQueryable&lt;T&gt;)在此之后包含2个元素,这些元素已添加到数据库中。

我希望第一个 Where 语句产生该序列中的所有元素,但不幸的是它留下了 0 个元素。

(为什么???)

相反,第二个Where 语句实际上产生了 2 个元素,因为它应该可以工作。

这里是第一个和第二个Where 语句的NHibernate -&gt; 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 =&gt; true) 绝对可以正常工作。

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

谢谢。

【问题讨论】:

  • 这很可能与 NHibernate 处理它从 lambda 创建的表达式的方式有关,尽管天知道它在做什么......

标签: c# linq nhibernate lambda iqueryable


【解决方案1】:

我不知道 NHibernate,但是从生成的 SQL 中问题很明显:您的数据库不认为 true(小写 t)等于 True(大写 T)。在 SQL Server 中,您可以通过修改数据库排序规则来更改此设置(这是一个非常糟糕的主意,除非您出于其他原因希望不区分大小写)。

我猜这是您需要解决的 NHibernate 中的错误。测试 t =&gt; 1 == 1 而不是 t =&gt; true,这可能取决于 NHibernate 代码的编写方式。

【讨论】:

    【解决方案2】:

    我的猜测是,根据您显示的 SqLite 输出,这是 NHibernate 中的一个错误。你可以试试X =&gt; X.Id == X.Id 而不是X =&gt; true 看看是否可行。

    【讨论】:

      【解决方案3】:

      对我来说似乎是一个错误。它将布尔运算转换为字符串评估,即使这样也搞砸了,因为它使用true 设置查询并使用True 进行评估,因此区分大小写的测试会失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 2013-11-15
        • 2021-12-02
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多