为什么Linq与Nhibernate会产生外连接

时间:2010-07-21 15:05:25

标签: nhibernate oracle9i linq-to-nhibernate

我有一个问题,Linq到Nhibernate使用外连接生成查询。

例如:

return Session.Linq<ClientContact>().Where(c => c.Client.Id = 13).ToList();

生成类似于:

的查询

SELECT... FROM mw_crafru.clientcontact this_, mw_crafru.client client1_, mw_crafru.relationshiptype relationsh4_ WHERE this_.clientid = client1_.clientid(+) AND this_.relationshiptypeid = relationsh4_.relationshiptypeid AND client1_.clientid = :p0;:p0 = 13

注意外连接。 clientid = client1 .clientid(+)。 BOO!

为了解决这个问题,我回到使用Session.CreateCriteria。

return Session.CreateCriteria(typeof (ClientContact)).Add(Restrictions.Eq("Client.Id", clientId)).List<ClientContact>();

生成以下查询:

SELECT... FROM mw_crafru.clientcontact this_, mw_crafru.client client1_, mw_crafru.relationshiptype relationsh4_ WHERE this_.clientid = client1_.clientid AND this_.relationshiptypeid = relationsh4_.relationshiptypeid AND client1_.clientid = :p0;:p0 = 13

注意没有外连接。 clientid = client1 .clientid。耶!

任何人都知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

至少使用SQL Server,使用Fluent NH与not-null="true"Not.Nullable()进行多对一映射会导致Get操作使用内部联接而不是左联接。尝试将其添加到ClientContact中的Client映射中。