【问题标题】:NHibernates QueryOver and reverse associationsNHibernates QueryOver 和反向关联
【发布时间】:2017-03-30 09:46:37
【问题描述】:

如何使用 NHibernate 的 QueryOver 找到没有引用的任何 C 类?

public class A {
    public List<C> c { get; set; }
}

public class B {
    public List<C> c { get; set; }
}

public class C {
}

SQL 中也是这样:

select C.* from C
left join A on C.Id = A.C
left join B on C.Id = B.C
where A.Id is null and B.Id is null

如果我只有一个加入,这样的事情会起作用:

session.QueryOver<A>(() => a)
    .Right.JoinQueryOver(() => a.C, () => c)
    .WhereRestrictionOn(() => a.DbId)
    .IsNull
    .List() // TODO: use transfomer to select C

编辑:我不确定引用是 List&lt;C&gt; 还是简单的 C 是否重要。

无论如何,我很感兴趣如何在C 上进行查询,然后在我没有直接path 可用的地方进行连接

【问题讨论】:

  • 您应该使用session.QueryOver(() =&gt; c).Left.JoinAlias(c =&gt; c.a, () =&gt; a).Left.JoinAlias(c =&gt; c.b, () =&gt; b) 而不是JoinQueryOver 来驱逐更改查询根,但您需要在C 中添加AB 引用。
  • @Najera 重点是没有c.ac.b。只有AB 引用了C,但反之则不然。不过还是谢谢。
  • 检查 Linq 是否支持您的查询作为不相关的实体 stackoverflow.com/a/29923220/1486443

标签: c# nhibernate queryover


【解决方案1】:

这样的事情似乎有效,但不是我希望的答案:

C c = null;
var aSubquery = QueryOver.Of<A>()
    .JoinAlias(a => a.C, () => c)
    .Select(Projections.Property(() => c.Id));
var bSubquery = QueryOver.Of<B>()
    .JoinAlias(b => b.C, () => c)
    .Select(Projections.Property(() => c.Id));
session.QueryOver<C>()
    .WithSubquery
    .WhereProperty(x => x.Id).NotIn(aSubquery)
    .WithSubquery
    .WhereProperty(x => x.Id).NotIn(bSubquery);

如果您有更好的答案,请提供替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2010-11-26
    相关资源
    最近更新 更多