2011-04-11 42 views
0

我知道有限制“In”,它允许检测属性中的一个或多个元素是否在目标列表中,但我需要的东西会告诉我,如果属性中的所有项目都在目标列表。这里有一个例子:列表查询与nHibernate中的所有项目

我想一个人与所有这些能力

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

的人物和PersonB之间:

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

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

是否有限制或表达这将允许我执行这个搜索或你知道一个干净的方法来做到这一点,而不是在“连接”中堆叠“In”吗?

由于提前,

艾蒂安Brouillard

+0

您的意思是使用标准? – 2011-04-11 14:05:14

+1

连接不够干净吗? – 2011-04-11 14:10:01

+0

对于你的第一个问题斯蒂芬,是的。至于第二,我想知道,因为我认为这可能是一种常见的情况。我在使用Conjuction时没有问题,答案可能是没有特定的表达/限制。 – 2011-04-11 14:16:13

回答

0

我找到一种方式来获得我想要的结果。 Stacking“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。

相关问题