列表中的所有项目都使用nHibernate查询

时间:2011-04-11 13:46:04

标签: c# nhibernate nhibernate-mapping

我知道有限制“In”允许检测属性中的一个或多个元素是否在目标列表中但我需要一些能告诉我属性中的所有项是否都在目标列表中的东西。这是一个例子:

我想要一个拥有所有这些能力的人

CompetenciesCriterion : IList<Competency>
  { Walking, Running, Rolling }

在PersonA和PersonB之间:

PersonA : Person
  Competencies : IList<Competency>
    { Walking }

PersonB : Person
  Competencies : IList<Competency>
    { Walking, Rolling, Running }

是否存在允许我执行此搜索的限制或表达式,或者您是否知道一种干净的方法来执行此操作而不是在“连接”中堆叠“In”?

提前致谢,

ÉtienneBrouillard

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来获得我想要的结果。堆叠“In”不起作用所以我发现使用子查询并计算“In”将产生一个标准,我可以在该标准上验证计数相等的条件。

以下是一个示例:

var competencySubQuery = DetachedCriteria.For<Employee>("employee2");
competencySubQuery.CreateAlias("employee2.Competencies", "employee2Competencies");
competencySubQuery.SetProjection(Projections.Count(Projections.Property("employee2Competencies.Competency")));
competencySubQuery.Add(Restrictions.In("employee2Competencies.Competency",     searchCriteria.Competencies));
competencySubQuery.Add(Restrictions.EqProperty("employee2.Id", "Employee.Id"));
criteriaJunction.Add(Subqueries.Eq(searchCriteria.Competencies.Count(), competencySubQuery));

criteriaJunction是FindAll和searchCriteria最终使用的标准  是包含发送给服务的标准的POCO。