意外的Linq行为 - ToList()

Key*_*ner 8 .net c# linq linq-to-nhibernate

理论上我有两个类似的查询返回相同的结果:

var requestNotWorking = SessionManagement.Db.Linq<Item>(false).Where(i => 
                        i.Group != null && i.Group.Id == methodParameter)
                       .ToList();
Run Code Online (Sandbox Code Playgroud)

此请求返回0项,即使它应该返回一项.以下是对后者的重写,但是调用了该ToList()方法.此请求有效并返回第一个查询中预期的项目!

var requestWorking = SessionManagement.Db.Linq<Item>(false).ToList().Where(i => 
                     i.Group != null && i.Group.Id == methodParameter).ToList();
Run Code Online (Sandbox Code Playgroud)

注意:SessionManagement.Db.Linq<Item>(false)是一个通用的Linq到Nhibernate方法,其布尔属性确定请求是否必须在缓存(true)或数据库(false)中执行.这种方法应该没有错,因为它在解决方案的许多其他部分正常工作.Item的映射没什么特别之处:没有包包和以下参数: lazy="false" schema="dbo" mutable="false" polymorphism="explicit"

为什么会这样?

编辑:

生成的requestNoWorking的sql请求以:

(Item.Group_ID is not null) and Item.Group_ID=@p0',N'@p0 int',@p0=11768

生成的requestWorking的sql请求大致是一个 select * from dbo.Items

Key*_*ner 1

我对你的理论非常感兴趣c.Group.Id != null,我发现它是合乎逻辑的,尽管它与我的解决方案中的其他代码片段相矛盾。然而,删除它并没有改变任何东西。我发现删除mutable="false"财产可以解决问题。这看起来有点神奇,但确实有效。

我发布的请求实际上发生在检查更新/删除可能性的方法中。我的结论是,以某种方式使 Item 不可变会导致结果失败。但我不明白为什么 requestWorking 会起作用!