2010-02-17 41 views
3

我剛剛研究了一點NHibernate,並且遇到了我必須編寫的更復雜(對我來說)查詢中的一個問題。該場景是:不能在InExpression中使用集合

我有一個'Staff'對象,其中附有'技能'集合。我想通過一個'技能'列表來查詢(例如,如果我只想要'Cook'或'Code'或兩者都可以的人)並返回匹配的員工列表,但我有有點麻煩....

我有什麼目的明智是:

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(「技能」,skillsSearchList)「,但不能在兩個集合在場時使用(例如,如果他們只有一種技能,它會沒問題!)...任何指針?

回答

5

您需要

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

我不知道這是否可以用技能對象的列表來完成。無論哪種方式,SQL將會如上所述結束。

請注意,這將創建笛卡爾產品,因此您可能想要使用存在的子查詢或.SetResultTransformer(new DistinctRootEntityResultTransformer())來取回不同的員工列表。

+0

它的作品,太棒了! 如前所述,它似乎不適用於技能對象,但ID很好,因爲這是我從視圖上的過濾器控件回來的。 – Paul 2010-02-18 15:03:45