2011-06-30 11 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私が探していたクエリは、私は、私はabcdtoを得ることができるように基準を書くための最良の方法を教えてくださいされてしようとしています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%' 

基準です結果としてオブジェクト

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の内のオブジェクトに参加することはできません。

だから私は、次のクラス定義を推定しますあなたの例を取っ​​て:あなたは、必要に応じて内部または左は、あなたがどのように処理するかに応じて、参加を選択することができ

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>(); 

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;} 
} 

そして、あなたの基準クエリは次のようになりクライテリアクエリ内のnull参照。

関連する問題