Это пример с QueryOver, но он почти как ICriteria.
Contact contact = null;
mappingSession.QueryOver<Task>()
.JoinAlias(() => task.Contact, () => contact)
.SelectList(list => list
.SelectGroup(task => task.Id)
.Select(task => task.Text)
.Select(() => contact.Name))
.TransformUsing(Transformers.DistinctRootEntity)
.List();
Другое - это отображение.Вы можете составить базовый объект «Контакт» и расширить из него Пользователь и Компанию.