无法使用InExpression集合

时间:2010-02-17 20:04:59

标签: nhibernate

我刚刚研究了一些NHibernate,我遇到了一个我必须编写的更“复杂”(对我来说)查询的问题。场景是:

我有一个'Staff'对象,附有'Skills'的集合。我想传递一个“技能”列表来查询(例如,如果我只想要那些可以'烹饪'或'代码',或两者都有的人)并返回一个匹配的工作人员列表,但我有有点麻烦....

我反对的是:

public class StaffMember : Resource
{
    public virtual string EmployeeId { get; set; }      

    public virtual bool IsTeamLeader { get; set; }

    public virtual StaffMember TeamLeader { get; set; }

    public virtual IList<Skill> Skills { get; set; }
}

public class Skill : BaseDomainObject
{
    public virtual string Name { get; set; }
}

我猜SQL会像:

select distinct st.*
from staff st, resource re
inner join staffskills sks on re.id = sks.staffresourceid
inner join skill ski on ski.id = sks.skillid
where st.resourceid = re.id
and ski.id in (1,2,3,4)

我尝试在标准中使用“Expression.InG(”技能“,技能搜索列表)”但是当两个集合在场时不能使用(例如,如果他们只有一个技能,那就没关系了! )...任何指针?

1 个答案:

答案 0 :(得分:5)

你需要

.CreateAlias("Skills", "sks")
.Add(Restrictions.In("sks.id", skillIdList))

我不确定是否可以使用技能对象列表来完成此操作。无论哪种方式,sql将最终与上面相同。

请注意,这将创建一个笛卡尔积,因此您可能希望使用存在的子查询或.SetResultTransformer(new DistinctRootEntityResultTransformer())来获取不同的工作人员列表。