2009-12-14 2 views
2

DetachedCriteria 실행에 ICriterion을 추가하여 데이터베이스를 조회하기 전에 SubType 필드에 NHibernate 쿼리를 필터링 할 수있는 방법이 있습니까? 이 내 목표를 달성 할 수있는 올바른 방법을하지 않을 수 있지만, 내가 리팩토링하는 것을 기대하고 있지 않다 있기 때문에 적어도 가능 바라고ICriterion으로 NHibernate SubType 필터링하기

DetachedCriteria detachedCriteria = DetachedCriteria.For(typeof(MyObject)); 

    ProjectionList projectionList = Projections.ProjectionList(); 
    projectionList.Add(Projections.SqlProjection("{alias}.SubType as SubType", new string[] { "SubType" }, new IType[] { TypeFactory.GetAnsiStringType(15) })); 

    dc.SetProjection(projectionList); 
    dc.Add(Expression.Eq("SubType", "MYOBJECT")); 

    using(ISession session = ...) 

    { 

     ICriteria criteria = detachedCriteria.GetExecutableCriteria(session); 

    // Blows up because I don't know how to reference the SubType 
    // field with an ICriterion (Expression.Eq("SubType", "MYOBJECT")) 
     IList list = criteria.List(); 

    ... 

    } 

:

내 코드는 다음과 같이 보입니다 ICriterion을 기대하거나 생성하는 나의 인터페이스. 또한 필자는 ICriterion 객체를 만들 필요가있는 곳 근처에서 세션에 액세스 할 필요가 없습니다 (그러나 사용되는 다양한 NHibernate 필드/테이블의 앨리어싱/명명에 대한 완전한 제어권을가집니다).

답변

5

이것에 대한 답을 찾기 위해 주위에 인터넷 검색을 꽤 툭, 여기있다 : http://derek-says.blogspot.com/2008/08/excluding-particular-derived-types-in.html

ICriteria crit = sess.CreateCriteria(typeof(Mammal)); 
    crit.Add(Expression.Not(Expression.Eq("class", typeof(DomesticCat)))); 
    List mammals = crit.List(); 
+0

나는 이런 식으로 뭔가를 필요! 고맙습니다! 제 경우에는 특정 유형에 1을, 다른 유형에 2를 보유 할 열이 필요했습니다! VAR productTypeConditional = Projections.Conditional (Restrictions.Eq ("클래스"의 typeof (냉장고)), \t \t \t Projections.Constant (ProductType.Refrigerator), \t \t \t Projections.Constant (ProductType : 이처럼 종료 .조각)); – cidico

관련 문제