NHibernate Linq正在生成一个未被发现的查询。这是我的班级映射:
public class OrderClassMap : ClassMap<Order> {
public OrderClassMap() {
Id(x => x.PersistenceId).Column("RowId").GeneratedBy.Assigned();
Version(x => x.PersistenceVersion).Column("RowVersion");
Map(x => x.OrderId).Generated.Insert().Not.Update();
Map(x => x.OrderDate);
References(x => x.Overseer).Column("OverseerId").PropertyRef(x => x.OverseerId);
References(x => x.Overseer2).Column("OverseerId2").PropertyRef(x => x.OverseerId2);
}
}
public class OverseerClassMap : ClassMap<Overseer> {
public OverseerClassMap() {
Id(x => x.PersistenceId).Column("RowId").Generated.Assigned();
Version(x => x.PersistenceVersion).Column("RowVersion");
Map(x => x.OverseerId).Generated.Insert().Not.Update();
Map(x => x.Name);
Map(x => x.Email);
}
}
这是我的Linq查询:
var orders = session.Query<Order>()
.Where(o => ((o.Overseer.OverseerId == 1) || (o.Overseer.OverseerId == 2)))
.Fetch(o => o.Overseer)
.Fetch(o => o.Overseer2);
生成的SQL查询不是我所期望的。它不进行左外连接,而是进行笛卡尔连接。以下是NHibernate生成的查询的缩写示例:
SELECT ...
FROM Orders o LEFT OUTER JOIN
Overseers v1 ON o.OverseerId = v1.OverseerId LEFT OUTER JOIN
Overseers v2 ON o.OverseerId2 = v1.OverseerId,
Overseers v3,
Overseers v4
WHERE o.OverseerId = v3.OverseerId AND
o.OverseerId2 = v4.OverseerId AND
(v3.OverseerId = 1 OR v4.OverseerId = 1)
我期望的查询将是:
SELECT ...
FROM Orders o LEFT OUTER JOIN
Overseers v1 ON o.OverseerId = v1.OverseerId LEFT OUTER JOIN
Overseers v2 ON o.OverseerId2 = v1.OverseerId
WHERE (v1.OverseerId = 1 OR v2.OverseerId = 1)
我认为这样做是因为我有一个遗留数据库并且在我的映射中使用了PropertyRef。有没有办法解决这个意想不到的行为? NHibernate为什么会这样?这对我没有意义,因为通过指定PropertyRef,我说“使用此密钥而不是主键”。
答案 0 :(得分:0)
尝试使用QueryOver&lt;&gt;,并指定左外连接。
答案 1 :(得分:0)
我并不完全确定我理解你要在这里实现的目标,但在我看来,你的PropertyRef映射是错误的。
如果您希望OverseerId
中的OverseerId2
和Order
到OvreseerId
表格中的Overseers
列,那么您的属性参考值应为{{ 1}}在两种情况下:
OverseerId