C# NHibernates查询和反向关联

C# NHibernates查询和反向关联,c#,nhibernate,queryover,C#,Nhibernate,Queryover,如何使用NHibernate的QueryOver查找没有引用的C类 public class A { public List<C> c { get; set; } } public class B { public List<C> c { get; set; } } public class C { } 如果我只有一个加入,类似这样的东西会起作用: session.QueryOver<A>(() => a) .Right.J

如何使用NHibernate的
QueryOver
查找没有引用的
C

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

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

public class C {
}
如果我只有一个加入,类似这样的东西会起作用:

session.QueryOver<A>(() => a)
    .Right.JoinQueryOver(() => a.C, () => c)
    .WhereRestrictionOn(() => a.DbId)
    .IsNull
    .List() // TODO: use transfomer to select C
session.QueryOver(()=>a)
.Right.JoinQueryOver(()=>a.C,()=>C)
.WhereRestrictionOn(()=>a.DbId)
.IsNull
.List()//TODO:使用Transformer选择C
编辑:我不确定引用是
List
还是纯
C


无论如何,我感兴趣的是如何在
C
上创建查询的根,然后在没有直接
路径的地方执行联接类似的操作似乎可行,但不是我希望的答案:

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);
C=null;
var aSubquery=QueryOver.Of()
.JoinAlias(a=>a.C,()=>C)
.选择(projects.Property(()=>c.Id));
var bSubquery=QueryOver.Of()
.JoinAlias(b=>b.C,()=>C)
.选择(projects.Property(()=>c.Id));
session.QueryOver()
.带subquery
.WhereProperty(x=>x.Id).NotIn(aSubquery)
.带subquery
.WhereProperty(x=>x.Id).NotIn(bSubquery);

如果您有更好的答案,请提供另一种选择。

您应该使用
session.QueryOver(()=>c).Left.JoinAlias(c=>c.a,()=>a).Left.JoinAlias(c=>c.b,()=>b)
而不是
JoinQueryOver
退出更改查询根目录,但是您需要在
C
@Najera中添加
A
B
引用。关键是没有
C.A
C.B
。只有
A
B
引用了
C
,而不是相反。不过谢谢。请检查Linq是否作为不相关的实体支持您的查询
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);