В настоящее время принятый ответ основан на коррелированном подзапросе, который, как правило, является просто «плохим SQL».
Гораздо лучше просто выразить это, используя семантику на основе множеств, а не более функциональный подход.
По сути, вы хотите, чтобы ваш SQL выглядел так:
SELECT
A.Id
FROM A
LEFT OUTER JOIN B ON A.Id = B.FKtoA
WHERE B.Date < @MyDate
Это читается как «Я хочу, чтобы набор столбцов из A относился к набору B, где дата B меньше некоторого значения». Этого можно достичь с помощью API-интерфейса ICriteria:
ICriteria criteria = session.CreateCriteria<A>();
criteria.CreateAlias("MyList", "b", JoinType.LeftOuterJoin)
criteria.Add(Restrictions.Lt("b.Date", myDate));
criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());
criteria.List<A>();
Частью хитрости является использование встроенного в NHibernate DistinctRootEntityResultTransformer: поскольку левое внешнее объединение может возвращать несколько экземпляров A на B, мы хотим, чтобы наши критерии ICriteria возвращали только отдельные экземпляры (при условии, что нас не волнует порядок или что-то еще еще).