为什么nhibernate LINQ不支持简单的外连接(在外连接表上给出where子句)?

时间:2011-01-03 21:03:40

标签: c# sql-server linq nhibernate

我有 tableA tableB

tableA具有 B_Id 属性。

此查询正常工作:

 IEnumerable<A> a = Session.Query<A>().Fetch(r=>r.B);

但我想要的是:

 IEnumerable<A> a = Session.Query<A>().Where(r=>r.B.Active).Fetch(r=>r.B);

似乎当我这样做时,它不再是一个简单的外连接,如果表B中没有活动记录,我就没有结果。

我想做一个纯粹的外部连接,它仍会给我结果,但是A实体的B属性为null。

nhibernate LINQ是否支持在外连接表上放置where子句的能力?

2 个答案:

答案 0 :(得分:3)

根据this post on the nhusers group,它显然不受支持,你必须使用HQL。

至于为什么,我会推测作者计划添加它但具有更高的优先级。我个人认为这是一个关键特征。

答案 1 :(得分:0)

猜猜:.Where(a => a.B == null || a.B.Active)

一个想法:您正在尝试选择将处于未知状态的A实例。 NHibernate如何在A的实例之间有所不同,其中B == null和B.Active == false?

如果它起作用,它们将返回B的空值,并且将使用空引用填充A.如果再次保存A会发生什么?是否应将对B的引用设置为null?当B.Active == false时,这将删除引用。应该不受影响吗?这将使NHibernate存储一个不代表您的域对象的状态。