2012-09-28 4 views
4

오늘 우리의 레거시 데이터베이스에서 필드가 이 아니어야이 비어 있어야하는 상황이 발생했습니다 ... 비어있었습니다.NHibernate Queryover where 절에서 String.IsNullOrEmpty() 테스트를 수행하려면 어떻게해야합니까?

이 데이터베이스에 대해 NHibernate 3.2를 사용 중이며 영향을받는 쿼리는 QueryOver로 작성됩니다. 나는이 때

 return Session 
      .QueryOver<FacilityGroup>() 
      .Where(fg => fg.Owner.Id == Token.OwnerId && 
         fg.UserName == Token.UserName && 
         !string.IsNullOrEmpty(fg.Code))     
      .OrderBy(fg => fg.Code).Asc 
      .TransformUsing(Transformers.DistinctRootEntity); 

나는 예외가 "인식 할 수없는 메서드 호출 : 선택 System.String : 부울 IsNullOrEmpty (

나의 현재 쿼리는 내가이되고 싶어이

return Session 
     .QueryOver<FacilityGroup>() 
     .Where(fg => fg.Owner.Id == Token.OwnerId && 
        fg.UserName == Token.UserName) 
     .OrderBy(fg => fg.Code).Asc 
     .TransformUsing(Transformers.DistinctRootEntity); 

입니다 System.String) "

그래서 NHibernate는 string.IsNullOrEmpty를 변환 할 수 없습니다. 공정하다. 그러나 내가하려고 할 때 내가

어떤 생각 " 'Domain.Entities.FacilityGroup' ''범위에서 참조하지만 정의되지 않은 유형의 변수 'FG'"InvalidOperationException이 얻을이

 return Session 
      .QueryOver<FacilityGroup>() 
      .Where(fg => fg.Owner.Id == Token.OwnerId && 
         fg.UserName == Token.UserName && 
         !(fg.Code == null || fg.Code.Trim() == "")) 
      .OrderBy(fg => fg.Code).Asc 
      .TransformUsing(Transformers.DistinctRootEntity); 

?

+0

에? – Rippo

+0

트림없이() 작동 ... – NYCChris

답변

12

좋아 ... 내가이 질문을 너무 빨리 요청한 것 같습니다. 나는이 문제를 해결할 길을 찾아 냈다.

SQL Function Projection을 통해 hql에서 'trim'함수를 호출 할 수있었습니다. 나는 그것을 유연하게 유지하기 위해 IQueryOver Extention 메서드로 작성했다. 나는 누군가 그것을 필요로하는 경우에 대비하여 여기에 게시 할 것이다.

public static class QueriesExtentions 
{ 
    public static IQueryOver<E, F> WhereStringIsNotNullOrEmpty<E, F>(this IQueryOver<E, F> query, Expression<Func<E, object>> propExpression) 
    { 
     var prop = Projections.Property(propExpression); 
     var criteria = Restrictions.Or(Restrictions.IsNull(prop), Restrictions.Eq(Projections.SqlFunction("trim", NHibernateUtil.String, prop), "")); 
     return query.Where(Restrictions.Not(criteria)); 
    } 
} 

하고 여기에 당신이이`트림()`를 제거하면 어떻게됩니까 사용

return Session 
     .QueryOver<FacilityGroup>() 
     .Where(fg => fg.Owner.Id == Token.OwnerId && fg.UserName == Token.UserName) 
     .WhereStringIsNotNullOrEmpty(fg => fg.Code) 
     .OrderBy(fg => fg.Code).Asc 
     .TransformUsing(Transformers.DistinctRootEntity); 
+0

저기! 좋은 답변 – Rippo

+0

좋은 !! trim()과 똑같은 문제가있었습니다. 답변을 주셔서 감사합니다. – Onkar

+0

다행히 도울 수있었습니다! – NYCChris

관련 문제