Только что решив связанную проблему и в конце концов придя к решению, я подумала, что поделюсь ответом здесь:
Предполагается, что требуется исходный запрос вопросов с дополнительным условием для подзапроса:
SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id
AND Quantity = 5)
Предполагая, что у вас есть ссылка в классе Baz на родительский объект, называемый, скажем, FooBarRef [в классе Fluent Map, для которого вы будете использовать метод References ()], вы создадите запрос следующим образом:
DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
.SetProjection(Projections.Property("baz.FooBarId"))
.Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id"))
.Add(Expression.Eq("baz.Quantity", 5));
var fooBars = Session.CreateCriteria<FooBar>("fooBar")
.Add(Subqueries.Exists(dCriteria)).List<FooBar>();
Я не на 100% убежден в жестком кодировании псевдонима "this", который является псевдонимом, который NHibernate автоматически назначает корневому объекту (таблице) в запросе, но я нашел единственный способ ссылаться на ключ таблицы родительского запроса из подзапроса.