我刚刚钻研了一些NHibernate,我遇到了一个比较复杂的问题(对我而言)我必须写的问题.场景是:
我有一个'Staff'对象,附有一些'技能'.我想传递一个"技能"列表来查询(例如,如果我只想要那些可以'烹饪'或'代码',或两者都有的人)并返回一个匹配的工作人员列表,但我有有点麻烦....
我反对的是:
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; }
}
Run Code Online (Sandbox Code Playgroud)
我想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)
Run Code Online (Sandbox Code Playgroud)
我试图在标准中使用"Expression.InG("技能",技能搜索列表)"但是当两个集合在游戏中时不能使用(例如,如果他们只有一个技能,那就没问题了!)..任何指针?
你需要
.CreateAlias("Skills", "sks")
.Add(Restrictions.In("sks.id", skillIdList))
Run Code Online (Sandbox Code Playgroud)
我不确定是否可以使用技能对象列表完成此操作.无论哪种方式,sql将最终与上面相同.
请注意,这将创建一个笛卡尔积,因此您可能希望使用存在子查询或.SetResultTransformer(new DistinctRootEntityResultTransformer())获取不同Staff的列表.
| 归档时间: |
|
| 查看次数: |
2206 次 |
| 最近记录: |