2011-06-30 83 views
0
public class A 
{  
public string aname {get; set;} 
public string aId {get; set;}             
public string bId {get; set;} 
} 

public class B 
{  
public string bId {get; set;}             
public string bname {get; set;}             
public string cId {get; set;} 
} 

public class C 
{                     
public string cId {get; set;} 
public string cfirstname {get; set;}  
public string clastname {get; set;} 
} 

public class abcDTO 
{ 
public string aname {get; set;} 
public string bname {get; set;} 
public string clastname {get; set;} 
} 

Evetually這我期待的查詢是NHibernate的標準

SELECT a.aid, b.bname, c.clastname FROM A thisa 
inner join B thisb on thisa.bid=thisb.bid 
inner join C thisc on thisb.cid=thisc.cid and this_.POLICY_SEARCH_NBR like '%-996654%' 

我正努力的,請讓我知道的最好的方式來寫一個標準,這樣我可以得到abcdto的標準對象作爲結果

var policyInsuranceBusiness = DetachedCriteria.For<A>() 
       .SetProjection(Projections.Property("a.aid")) 
       .Add(Restrictions.Like("a.aid", "1-SAP-3-996654", MatchMode.Anywhere)) 
       .CreateCriteria("b.bid", "b", JoinType.InnerJoin) 
       .SetProjection(Projections.Property("b.bname")) // ERROR OUT - COULD NOT RESOLVE PROPERTY 
       .CreateCriteria("c.cid", "c", JoinType.InnerJoin) 
       .SetProjection(Projections.Property("c.clastname")); // ERROR - COULD NOT RESOLVE PROPERTY 

IList<abcDTO> plo = policyInsuranceBusiness.GetExecutableCriteria(_session).SetResultTransformer(NHibernate.Transform.Transformers 
       .AliasToBean<abcDTO).List<abcDTO>(); 

回答

1

你無法加入NHibernate的對象,而無需在類和映射定義它們之間的關係。

所以,把你的例子我估計下面的類定義:

public class A {  
    public virtual string Name {get; set;} 
    public virtual string PolicySearchNumber {get; set;} 
    public virtual int Id {get; set;}             
    public virtual B B {get; set;} 
} 

public class B {  
    public virtual int Id {get; set;}             
    public virtual string Name {get; set;}             
    public virtual C C {get; set;} 
} 

public class C {                     
    public virtual int Id {get; set;} 
    public virtual string Firstname {get; set;}  
    public virtual string Lastname {get; set;} 
} 

public class abcDTO { 
    public string int aid {get; set;} 
    public string aname {get; set;} 
    public string bname {get; set;} 
    public string clastname {get; set;} 
} 

和你的條件查詢將是:

var results = session.CreateCriteria<A>() 
    .CreateCriteria("B", "b") 
    .CreateCriteria("b.C", "c") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Id"), "aid") 
     .Add(Projections.Property("Name"), "aname") 
     .Add(Projections.Property("b.Name"), "bname") 
     .Add(Projections.Property("c.Lastname"), "clastname") 
    ) 
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(abcDTO))) 
    .List<abcDTO>(); 

您也可以選擇內部或左聯接取決於你如何處理條件查詢中的空引用。