我刚刚深入研究了一些 NHibernate,但我在必须编写的一个更“复杂”(对我来说!)的查询中遇到了麻烦。场景是:
我有一个“员工”对象,其中附加了一系列“技能”。我想传递一个“技能”列表来查询(例如,如果我只想要可以“烹饪”或“编码”或两者兼而有之的人)并返回匹配员工的列表,但我有有点麻烦……
我所得到的对象方面是:
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)”,但是当两个集合同时使用时不能使用(例如,如果他们只有一项技能,那就没问题了!)。 .有什么指示吗?
你需要
.CreateAlias("Skills", "sks")
.Add(Restrictions.In("sks.id", skillIdList))
我不确定这是否可以通过技能对象列表来完成。无论哪种方式,sql 的最终结果都与上面相同。
请注意,这将创建一个笛卡尔积,因此您可能需要使用存在子查询或.SetResultTransformer(new DistinctRootEntityResultTransformer())
获取不同员工的列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)