Критерии NHibernate - PullRequest
       5

Критерии NHibernate

0 голосов
/ 30 июня 2011
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;}
}

В действительности запрос, который я ищу, является

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 Ответ

1 голос
/ 30 июня 2011

Нельзя объединять объекты в 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>();

При желании вы можете выбрать внутренние или левые объединения в зависимости от того, как вы обрабатываете нулевые ссылки в запросе критериев.

...