Для того, что вы пытаетесь сделать, вам нужно написать любой запрос HQL
Так как у вас есть коллекции в ваших классах, и вы отобразили их в своих файлах .hbm.xml, например (если вы используете свободный nhibernate, игнорируйте это)
<bag name="Comments" inverse="true" lazy="extra">
<key column="CommentId" />
<one-to-many class="Comment,mylib" />
</bag>
<bag name="Votes" inverse="true" lazy="extra">
<key column="VoteId" />
<one-to-many class="Vote,mylib" />
</bag>
при звонке
Post post = ISession.Get<Post>(postId);
коллекции Comments
и Votes
инициализируются прокси.
Когда вы касаетесь коллекции как таковой
post.Comments.Count
NHibernate запустит выборочное количество (*) для комментариев с идентификатором сообщения postId
.
Если вы абсолютно хотите реализовать это с помощью формулы (потому что вы хотите, чтобы счетчик просматривался каждый раз, когда вы получаете сообщение) снова, вам не понадобится запрос HQL (или критерии в этом отношении)
EDIT:
Поскольку вам не нужны формулы и вы хотите получить результат за один цикл, вот решение на HQL (требуется приведенное выше отображение коллекции)
IQuery query = nhSession.CreateQuery("select p, count(p.Comments), p.(p.Votes) from Post p where p.id = :postId");
query.SetInt32("postId", postId);
object result = query.UniqueResult();
где result - массив (я думаю, ArrayList), где result [0] - объект типа Post, result [1] - количество комментариев (int / long), а result [2] - количество голосов (int / long )