Если я правильно понял вопрос, у вас есть объединяющая таблица, содержащая отношение PostId, TagId, которая называется Post_Tag_MM, и вы хотите, чтобы все сообщения, в которых НЕ было ни одного из тегов, идентифицированы набором идентификаторов тегов. Затем в простом sql вы можете сделать:
выберите * из сообщений, в которых идентификатор не указан (выберите отдельный PostId из Post_Tag_MM, где TagId в (1,2,3));
Используя API DetachedCrietria, этот подзапрос будет выглядеть следующим образом, при условии, что вы сопоставили таблицу Post_Tag_MM с классом PostTag:
var subCriteria = DetachedCriteria.For(typeof (PostTag))
.SetProjection(Projections.Property("PostId"))
.Add(Restrictions.PropertyIn("TagId", tagIdList));
присоедините и отмените критерии подзапроса 'property in' к вашим основным критериям, как это
var result = session.CreateCriteria.For(typeof(Post))
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.Add(Subqueries.PropertyNotIn("Id", subCriteria))
.List<Post>();