2014-07-07 2 views
2

이 쿼리가 있는데 어떻게 ORA로 WhereRestrictionOn을 설정했는지 찾을 수 없습니다. 이제 그들은 AND로 작동하지만 하나 또는 다른 것을 원합니다.WhereRestriction을 OR로하는 NHibernate QueryOver

var privateInfo = Session.QueryOver<ConContact>() 
      .JoinAlias(c => c.PrivateInfos,() => pi) 
      .WhereRestrictionOn(c => c.FirstName).IsLike(_selectedFirstLetter + "%") 
      .WhereRestrictionOn(c => c.LastName).IsLike(_selectedFirstLetter + "%") // todo: change to firstname OR lastname 
      .Where(c => c.Status == ContactStatus.Approved) 
      .Select(
       Projections.Property("pi.Id").WithAlias(() => sri.Id), 
       Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo 
       Projections.Property("pi.Address").WithAlias(() => sri.Address), 
       Projections.Constant("Contact").WithAlias(() => sri.Type) 
      ) 
      .TransformUsing(Transformers.AliasToBean<SearchResultInfo>()) 
      .List<SearchResultInfo>() 
      .ToList(); 

어떤 도움을 많이 주셔서 감사합니다!

해결책 :

var privateInfo = Session.QueryOver<ConContact>() 
      .JoinAlias(c => c.PrivateInfos,() => pi) 
      .Where(
       Restrictions.Disjunction() 
        .Add(Restrictions.Like("FirstName", _selectedFirstLetter + "%")) 
        .Add(Restrictions.Like("LastName", _selectedFirstLetter + "%")) 
      ) 
      .Where(c => c.Status == ContactStatus.Approved) 
      .Select(
       Projections.Property("pi.Id").WithAlias(() => sri.Id), 
       Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo 
       Projections.Property("pi.Address").WithAlias(() => sri.Address), 
       Projections.Constant(NewObjectType.Contact).WithAlias(() => sri.Type) 
      ) 
      .TransformUsing(Transformers.AliasToBean<SearchResultInfo>()) 
      .List<SearchResultInfo>() 
      .ToList(); 

답변

3

최상위 수준 (WhereRestrictionOn 포함) .Where() 가족는 항상 AND와 결합된다. 그래서 우리는 명시 적으로 같은 것을 사용해야합니다 :

.Where(
    Restrictions.Disjunction() 
     .Add(Restrictions.On<ConContact>(c => c.FirstName) 
           .IsLike(_selectedFirstLetter, MatchMode.Start)) 
     .Add(Restrictions.On<ConContact>(c => c.LastName) 
           .IsLike(_selectedFirstLetter, MatchMode.Start)) 
     // more OR ... 
     //.Add(Restrictions.On<ConContact>(c => c.MiddleName) 
     //      .IsLike(_selectedFirstLetter, MatchMode.Start)) 
) 

여기에서 설명하고있는 바와 같이 : 16.2. Simple Expressions, 간단한 물건 그래서

  • Restrictions.Or(restriction1, restriction1)
  • Restrictions.Disjunction().Add(restriction1).Add(restriction2).Add(...

를, 이것은 우리의 경우 수 우리는 심지어 할 수있다 use ||(인용되는 작은 예) :

.Where(p => p.Name == "test name" && (p.Age > 21 || p.HasCar)) 
+0

고마워요! 이것은 저를 위해 일해, 해결책은 화제에서 배치했다. –

+0

정말 대단합니다! Enjoy NHiberante;) ... 아마, 내가 생각했던'MatchMode'의 사용을 다시 생각해보십시오. –