NHibernate的Linq属性

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,我在说“使用此键而不是主键”。


尝试使用QueryOver <>,并指定左外部联接。


我不是很确定我明白你想在这里实现什么,但在我看来,你的PropertyRef映射是错误的。

如果你想在OverseerIdOverseerId2OrderOvreseerIdOverseers表,那么你的财产,裁判应和OverseerId在两种情况下:

References(x => x.Overseer).Column("OverseerId").PropertyRef(x => x.OverseerId);
References(x => x.Overseer2).Column("OverseerId2").PropertyRef(x => x.OverseerId);
链接地址: http://www.djcxy.com/p/60989.html

上一篇: NHibernate Linq property

下一篇: Fluent NHibernate join for property value