2011-06-24 18 views
1

我會首先暴露我想要做什麼,並解釋我的問題後。 我有2個表:「CharItem」和「屬性」,和一個表「ItemAttribute」來鏈接兩者,因爲它是一個m:n關係。該表格還可以爲該屬性定義一個值。NHibernate小組/ /有問題

我想搜索所有至少有一些屬性的項目。 SQL查詢是這樣的:

SELECT ci.* 
FROM  CharItem ci 
INNER JOIN ItemAttribute ia 
on ci.CharItemId = ia.CharItemId 
WHERE 
( 
(ia.AttributeId = 48 and ia.ValueX >= 1) 
or (ia.AttributeId = 6) 
) 
GROUP BY ci.CharItemId 
HAVING count(ia.AttributeId) >= 2 

因此,大家可以看到,我想要的是找到所有的項目,所以我的查詢必須返回 我一些項目對象。

我試過去做,我想我幾乎找到解決方案,但 我失去了一些東西。用下面的方法,我回到了良好的 ID,但不是一個完整的項目,我沒有找到如何得到一個完整的項目:X

var query = Session 
    .CreateCriteria(typeof(CharItem), "ci") 
    .CreateCriteria("ci.ItemAttribute", "ia", JoinType.InnerJoin); 
    Disjunction disjunction = Restrictions.Disjunction(); 
    foreach (var entry in itemAttribs) 
    { 
    var attribute = entry.Key; 
    var sign = entry.Value.Item1; 
    var value = entry.Value.Item2; 
    var restrictAttrib = Restrictions.Eq("ia.Attribute", attribute); 
    Conjunction conjunction =Restrictions.Conjunction(); 
    conjunction.Add(restrictAttrib); 
    conjunction.Add(Restrictions.Eq("ia.Value", values[j])); 
    disjunction.Add(conjunction); 
    } 
    query.Add(disjunction); 
    query.SetProjection(Projections.ProjectionList() 
    .Add(Projections.GroupProperty("ci.CharItemId"),"CharItemid")); 
    query.Add(Restrictions.Ge(Projections.Count("ia.Attribute"), itemAttribs.Count)); 
} 
var charItems = query.List<CharItem>(); 

感謝您的幫助。

解決!檢查答案,看看如何。

+1

歡迎來到SO。只要一上來就看看我所做的編輯,看看如何在你的代碼塊中獲得語法高亮。 – Aren

回答

1

當您使用投影時,NHibernate將只返回投影中指定的屬性。這就是爲什麼你只能在上述情況下獲得ID。如果您需要項目的所有其他屬性,則需要將它們明確地添加到投影列表中。

+0

我試過讓我的對象的所有屬性,但我仍然得到一個錯誤:「值\」System.Object [] \「是不是類型\」MulesOrganizerModel.EntityClasses.CharItem \「,不能用於這個通用集合。\ r \ n參數名稱:值「 – Itori

+1

你必須使用resulttransformer轉換對象數組到一個CharItem列表 – Sriram

+0

解決:)它現在有效,tyvm – Itori