2010-04-28 12 views
5

है, तो मेरे पास निम्न वर्ग संरचना है, यदि माता-पिता का चयन करने के लिए एनएचबीर्नेट मानदंड क्या है, तो उसके माता-पिता का चयन करने के लिए एनबीबेर्नेट मानदंड क्या है यदि उसके बच्चों में से कोई एक विशिष्ट नाम है?nHibernate मानदंड यदि किसी संग्रह में किसी बच्चे के पास एक विशिष्ट मान

public class Child 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

public class Parent 
{ 
    public int Id { get; set; } 
    public IList<Child> Children { get; set; } 
} 

उत्तर

15

मैं संग्रह में एक उपनाम बनाउंगा और प्रतिबंध जोड़ूंगा।

var parentsWithKidName = session.CreateCriteria<Parent>() 
    .CreateAlias("Children", "c", JoinType.InnerJoin) 
    .Add(Restrictions.Eq("c.Name", childName)) 
    .SetResultTransformer(Transformers.DistinctRootEntity()) 
    .List<Parent>(); 

यह परिणाम होगा

select p.* 
from parent p 
inner join child c on /* however it's mapped? */ 
where c.Name = ? 

में अलग जड़ इकाई ट्रांसफार्मर परिणाम सेट को संसाधित करने और डुप्लिकेट किए गए माता-पिता को हटा देगा। वे अभी भी तार भर में आते हैं।

0

मैं क्या किया था, माता पिता प्रकार के लिए एक मापदंड क्वेरी बनाने बच्चे प्रकार के लिए एक मापदंड क्वेरी बनाने के लिए वापसी का उपयोग करें, और उसके बाद बच्चे प्रकार उप क्वेरी के लिए विशिष्ट परिस्थितियों को जोड़ने के लिए किया गया था।

public virtual IList<T> GetByChildCriteria(string childName, 
    params ICriterion[] criterion) 
{ 
    ICriteria criteria = NHibernateSession 
    .CreateCriteria(persitentType) 
    .CreateCriteria(childName); 
    foreach (ICriterion criterium in criterion) 
    { 
     criteria.Add(criterium); 
    } 
    return criteria.List<T>(); 
} 

नोट: NHibernateSession चर प्रकार ISession का है।