gpt4 book ai didi

C# 奇怪的 lambda 行为

转载 作者:太空狗 更新时间:2023-10-29 18:33:06 25 4
gpt4 key购买 nike

有人能指出为什么会这样吗:

我正在使用 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 个元素。

(为什么???)

第二个Where相反,语句实际上会产生 2 个元素,因为它应该起作用。

这是 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 时会发生这种情况? ?这是错误还是我做错了什么?

谢谢。

最佳答案

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

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

关于C# 奇怪的 lambda 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com