NHibernates QueryOver и обратные ассоциации

Как мне найти C классы без ссылок с использованием NHibernate's QueryOver?

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<C> или просто C,

В любом случае, мне интересно, как я могу получить root права на C а затем сделать присоединения, где у меня нет прямого path имеется в наличии

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);

Если у вас есть лучший ответ, пожалуйста, предоставьте альтернативу.

Другие вопросы по тегам