Я недавно столкнулся с той же проблемой и действительно нигде не нашел хорошего решения для моей конкретной проблемы. В моем решении мне был нужен сопоставленный объект Tags, так как он был немного сложнее. Я опишу, что я сделал, если это кому-нибудь поможет. По сути это эквивалент следующего sql:
SELECT *
FROM Items I
WHERE 2 = (
SELECT COUNT(DISTINCT TagName)
FROM Tags T
WHERE T.ItemId = I.ID)
AND (T.TagName = 'X' OR T.TagName = 'Y')
)
NHibernate.ICriteria criteria = session.CreateCriteria(typeof(Item),"I");
ICriterion tagCriteria = null;
foreach (string tag in tagNames) {
ICriterion newCriteria = Expression.Eq("TagName", tag);
if (tagCriteria == null) {
tagCriteria = newCriteria;
} else {
tagCriteria = Expression.Or(tagCriteria, newCriteria);
}
}
if (tagCriteria != null) {
DetachedCriteria subCriteria = DetachedCriteria.For<Tags>("T");
subCriteria.SetProjection(Projections.CountDistinct("TagName"))
.Add(Expression.EqProperty("I.Id", "T.ItemId"))
.Add(tagCriteria);
criteria = criteria.Add(Subqueries.Eq(tagNames.Count,subCriteria ));
}
return criteria.List<Item>();