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
我对你的理论非常感兴趣c.Group.Id != null,我发现它是合乎逻辑的,尽管它与我的解决方案中的其他代码片段相矛盾。然而,删除它并没有改变任何东西。我发现删除mutable="false"财产可以解决问题。这看起来有点神奇,但确实有效。
我发布的请求实际上发生在检查更新/删除可能性的方法中。我的结论是,以某种方式使 Item 不可变会导致结果失败。但我不明白为什么 requestWorking 会起作用!
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |