我有以下两个表(模式简化):
Device
Id, IMSI, ...
SIM
IMSI, PhoneNumber, ...
因为设备可以使用不在SIM表中的SIM卡,所以我在Device.Map类中使用以下流畅的nhibernate映射:
References(x => x.Sim).Column("IMSI").NotFound.Ignore();
这工作按预期工作,直到我写了一个返回所有设备(几千)和内存使用天空飙升的查询。
SQL分析器显示而不是使用join生成一个单独的查询。 Nhibernate生成一个查询以获取所有设备,然后生成数千个查询以获取每个设备的SIM。
我尝试在映射中添加Fetch.Join()但得到了相同的结果。
我认为Nhibernate应该能够使用左连接生成单个查询并获得相同的结果。但我无法找到如何做到这一点。任何帮助将不胜感激。
有了这个查询:
var devices = session.Query<Device>()
.Fetch(x => x.Sim)
.ToList();
你会得到(几乎)你想要的东西。
NHibernate将在表之间生成LEFT OUTER JOIN
,但仍然为任何SELECT
生成单独的Device
而没有相应的SIM
。