nHibernate Присоединиться - PullRequest
0 голосов
/ 29 июня 2011

Я новичок в NHibernate. Можно ли создать критерии для приведенного ниже сценария?

public class A{
    public string name {get; set;}
}

public class B {
    public string name {get; set;}
}

public class C {
    public string firstname {get; set;}
    public string lastname {get; set;}
}

в конце концов я хочу построить следующий запрос

SELECT a.*, b.*, c.* FROM A AS a
INNER JOIN B as b ON a.id = b.Id 
INNER JOIN C AS c ON b.id = c.Id
WHERE o.lastname like '%ted%' 
OR c.firstname like '%test%' 
OR b.name like '%test%' 
OR a.name like '%test%'

Редактировать: занятия по комментарию автора.

public class A 
{ 
  public string aname {get; set;} 
  public string aId {get; set;} 
} 

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

public class C
{ 
  public string firstname {get; set;} 
  public string lastname {get; set;} 
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2016

Это может помочь

private IQueryOver<parententity>GetQuery(string nameA ,string nameB,string fname , string lname ){
          Conjuction Acon = Restriction.Conjunction;conjuction Bcon = Restriction.Conjunction;
          Conjuction Ccon = Restriction.Conjunction;

 if(string.isNullOrEmpty(nameA))
    Acon.Add(Restrictions.Like(Projections<Aentity>(x => x.name), nameA),MatachMode.Any););
 if(string.isNullOrEmpty(nameB))
    Acon.Add(Restrictions.Like(Projections<Bentity>(x => x.name), nameB),MatachMode.Any););
 if(string.isNullOrEmpty(fname))
    Acon.Add(Restrictions.Like(Projections<Centity>(x => x.Fname), Fname),MatachMode.Any););
 if(string.isNullOrEmpty(Lname))
    Acon.Add(Restrictions.Like(Projections<Centity>(x => x.Lname), Lname),MatachMode.Any););

       IQueryOver<Aentity> query = NHSession.QueryOver<AEniity>()
                  .where(Acon)
                  .joinQueryOver(x => x.Bcon)
                  .where(Bcon)
                  .joinQueryOver(x=> c.Ccon)
                  .where(Ccon);   

             return query;

}
0 голосов
/ 29 июня 2011

Я думаю, что это близко к тому, что вы после.Вероятно, существует более элегантный способ создания нескольких критериев "или".Я делаю предположение, что ваши классы выше действительно имеют идентификаторы и ссылаются друг на друга, так как они не включены в ваши базовые классы выше.

        ICriteria criteria = Session.CreateCriteria(typeof(a));

        criteria.CreateAlias("a.Id", "b", JoinType.InnerJoin);
        criteria.CreateAlias("b.Id", "c", JoinType.InnerJoin);

        criteria.Add(
            Expression.Or(

                Expression.Or(
                    Expression.Like("c.LastName", "Ted"),
                    Expression.Like("c.LastName", "Test")),

                Expression.Or(
                    Expression.Like("b.Name", "Ted"),
                    Expression.Like("a.Name", "Test"))
            )
        );

        criteria.List();

Я предполагаю, что ваша модель класса должна быть следующейна основании вашего заявления sql

public class A
{    
public string name {get; set;}
public B Id {get; set;}
}

public class B 
{    
public C Id {get; set;}
public string name {get; set;}
}

public class C 
{    
public string firstname {get; set;}    
public string lastname {get; set;}
}
...