Чтобы приблизить SQL-запрос к вашему, вы можете использовать следующие критерии:
var subCriteria = DetachedCriteria.For<Room>(); // subquery
subCriteria.Add(Expression.Eq("House", house)); // where clause in subquery
subCriteria.SetProjection(Projections.Id()); // DetachedCriteria needs to have a projection, id of Room is projected here
var criteria = session.CreateCriteria<Person>();
criteria.Add(Subqueries.PropertyIn("Room", subCriteria)); // in operator to search in detached criteria
var result = criteria.List<Person>();
Это выдает что-то вроде этого:
SELECT this_.Id as Id4_0_, this_.Name as Name4_0_, this_.RoomId as RoomId4_0_
FROM [Person] this_
WHERE this_.RoomId in (SELECT this_0_.Id as y0_ FROM [Room] this_0_ WHERE this_0_.HouseId = @p0)',N'@p0 int',@p0=1
Я тестировал его в FNH1.2 и NH3.1, но это должно хорошо работать и в NH2.1.
РЕДАКТИРОВАТЬ: UpTheCreek правильно.Linq более понятен, чем Criteria API.Например:
var query = session.Query<Person>().Where(x => x.Room.House == house);
var linqResult = query.ToList<Person>();
, который создает другой запрос SQL, но набор результатов тот же:
select person0_.Id as Id4_, person0_.Name as Name4_, person0_.Room_id as Room3_4_
from [Person] person0_, [Room] room1_
where person0_.Room_id=room1_.Id and room1_.House_id=2