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);
Если у вас есть лучший ответ, пожалуйста, предоставьте альтернативу.