Похоже, вы хотите, чтобы сотрудники ушли в отпуск на определенную дату.Я думаю, что это сработает, хотя я никогда раньше не использовал выражение «между» таким образом:
var detached = DetachedCriteria.For<AttendanceLeave>("al")
.Add(Expression.Between('2012-01-11', "LeaveFrom", "LeaveTo")) //this should be a DateTime
.Add(Restrictions.EqProperty ("al.EmpId", "e.emp_id")) //make sure to use "e" for employee criteria alias
.SetProjection (Projections.Count ("al.EmpId"));
var employeesOnLeave = session.CreateCriteria<Employee>("e")
.Add(Restrictions.Gt(Projections.Subquery(detached), 0))
.List();
Вы по-прежнему будете получать полный набор отпусков на каждого сотрудника, но это должен быть сотрудник, которого выхочу.
обновление - глядя на ваш комментарий, кажется, что-то вроде этого может быть тем, что вы ищете:
DateTime dateInQuestion = new DateTime(2012, 1, 11);
var employeesOnLeaveAsOfDateInQuestion =
session.CreateCriteria<Employee>("e")
.CreateCriteria("e.Attendances", "ea"
, NHibernate.SqlCommand.JoinType.LeftOuterJoin
, Restrictions.Between(dateInQuestion, "ea.LeaveFrom", "ea.LeaveTo"))
.List<Employee>();
Это похоже на работу - но вынеобходимо убедиться, что возвращаемые вами объекты не кэшируются, в противном случае будут возвращены кэшированные копии с полной коллекцией. Это - это то, с чем я тестировал - не совсем так, как в вашей ситуации, потому что сбор поддерживается через таблицу ссылок, но я думаю, что он будет работать так же в любом случае - вам, возможно, придется выселить коллекцию специально с помощью прямойхотя для многих (метод EvictCollection находится на фабрике сеансов, а не на сеансе).Этот бит вам нужен только для тестирования (в моих тестах база данных живет столько же времени, сколько и сеанс).В гисте есть также пример QueryOver, если вы хотите решить его таким образом.