我刚刚深入研究了一些 NHibernate,但我在必须编写的一个更“复杂”(对我来说!)的查询中遇到了麻烦。场景是:
我有一个“员工”对象,其中附加了“技能”集合。我想传递一个“技能”列表来查询(例如,如果我只想要可以“ cooking ”或“编码”或两者兼而有之的人)并返回匹配员工的列表,但我有有点麻烦......
我所得到的对象方面是:
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("Skills", SkillsSearchList)”,但是当两个集契约(Contract)时使用时不能使用它(例如,如果他们只有一项技能,那就没问题了! )...有什么指示吗?
最佳答案
你需要
.CreateAlias("Skills", "sks")
.Add(Restrictions.In("sks.id", skillIdList))
我不确定这是否可以通过技能对象列表来完成。无论哪种方式,sql 的最终结果都与上面相同。
请注意,这将创建一个笛卡尔积,因此您可能需要使用存在子查询或 .SetResultTransformer(new DistinctRootEntityResultTransformer())
来获取不同员工的列表。
关于nhibernate - 无法将集合与 InExpression 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283989/