Я пытаюсь ограничить количество объектов, которые будут возвращать критерии NHibernate. Похоже, что стандарт использует SetMaxResults, но это не работает должным образом, если мои критерии включают ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ для отношения «многие ко многим».
Пример:
У собак есть хозяева (отношение «многие ко многим»), и мне нужно найти до 10 собак, которые принадлежат некоторой группе владельцев. Делает
session.CreateCriteria<Dog>()
.CreateAlias("Owners", "Owners")
.Add(Restrictions.In("Owners.Id", idCollection)
.SetMaxResults(10)
.List<Dog>();
преобразуется в SQL-запрос, например
SELECT TOP(10) * FROM DOGS d
LEFT OUTER JOIN OWNERS_DOGS od ON d.id = od.id
WHERE od.OWNER_ID IN (:valueone, :valuetwo)
Мое ограничение TOP применяется слишком рано, в результате чего собака с несколькими владельцами, которые соответствуют критериям, многократно подсчитывается до моего предела в 10. Есть ли чистый способ сообщить NHibernate, что я хочу, чтобы она увлажняла только первые X объектов dog? Я, вероятно, не смогу отказаться от выполнения полного SELECT в базе данных, но было бы неплохо, если бы я мог избежать загрузки каждой собаки в системе, поскольку я собираюсь отображать только 10 из них.