2011-02-25 4 views
0

좋아요 그래서 좋은 예제를 찾을 수 없도록 분리 된 기준을 사용하는 방법을 더 잘 이해할 수 있습니다. 처음에는).분리 기준 (nhibernate 2 asp.net mvc 1) C#

2 개의 테이블이 있습니다. 게재 위치 및 게재 위치 수퍼바이저

내 PlacementSupervisor 테이블에는 Placement.PlacementID와 관련된 PlacementID의 FK가 있습니다. 그러나 nhibernate 모델 클래스에는 PlacementSupervisor가 있습니다. 게재 위치 ID (구체적으로 게재 위치 ID의 속성을 지정하는 것이 아니라 중요한 경우).

내가하려고하는 것은 - 수퍼바이저 ID에 값이 전달되면 해당 수퍼바이저 ID로 배치를 제한하려고합니다.

는 봤어 : 첫째 (sup.supervisorId = 5 sup.supervisorTypeId = U)

: 가에 입력 된 키워드와 일치하는 정보 제공자를 찾을 수 없습니다 : 다만 나에게 오류를 제공

ICriteria query = m_PlacementRepository.QueryAlias("p") 
.... 
    if (criteria.SupervisorId > 0 && !string.IsNullOrEmpty(criteria.SupervisorTypeId)) 
       { 

        DetachedCriteria entityQuery = DetachedCriteria.For<PlacementSupervisor>("sup") 
         .Add(Restrictions.And(
             Restrictions.Eq("sup.supervisorId", criteria.SupervisorId), 
             Restrictions.Eq("sup.supervisorTypeId", criteria.SupervisorTypeId) 
            )) 
        .SetProjection(Projections.ProjectionList() 
             .AddPropertyAlias("Placement.PlacementId", "PlacementId") 
             ); 
        query.Add(Subqueries.PropertyIn("p.PlacementId", entityQuery)); 
       } 

을 supervisorTypeId는 문자열입니다. 두 번째로 내가하려는 일을 달성하는 방법을 이해하지 못한다. 그래서 방금 투영법과 속성 별칭 및 하위 쿼리 옵션을 다양하게 조합 해 보았습니다. 내가 어떻게 다른 사람과 합류해야하는지 알지 못합니다. FK 키가 두 번째 테이블에있을 때 테이블/엔티티.

누군가 나를 올바른 방향으로 안내 할 수 있습니까? 데이터 관점에서 할 수있는 것처럼 쉬운 일처럼 보입니다. 바라건대 나는 명백한 것을 놓치고 있습니다 !! 즉시 세션에서 사용하지 않으려면

+0

DB 모델, 개체 및 매핑을 표시 할 수 있습니까? – Sly

답변

0

위에서 수정 된 코드를 사용할 수있게되었습니다.

query.CreateCriteria("Supervisors") 
     .Add(Restrictions.Eq("SupervisorId", (int)criteria.SupervisorId)) 
     .Add(Restrictions.Eq("SupervisorType.SupervisorTypeId", criteria.SupervisorTypeId)); 

수퍼바이저는 내 게재 위치 모델 클래스의 속성입니다.

표현식이 제한 사항에 의해 세미 - 비추천되었음을 유의하십시오.

1

This might help. It's a good overview of the criteria api by Fabio Maulo

일반적으로 당신은 DeteachedCriterias를 사용하므로 당신이 정말로 하나가 필요합니다처럼 소리가 나지 않습니다.

IList placements = sess.CreateCriteria(typeof(Placement)) 
       .CreateAlias("PlacementSupervisor", "sup") 
       .Add(Expression.EqProperty("sup.supervisorId", criteria.SupervisorId")) 
       .Add(Expression.EqProperty("sup.supervisorTypeId", criteria.SupervisorTypeId)) 
       .List(); 

다른 몇 가지주의 사항 :

위의 링크 (섹션 13.4) (나는 당신의 조건에 맞게 수정 한) 예를 들어 준다

  1. 을 나는 약을 걱정하지 것이다 FK입니다. 관계를 매핑 한 동안 NH는 가입 방법을 알아낼 수 있습니다.
  2. 속성 이름은 대소 문자를 구분합니다. 그래서 "sup.SupervisorId"로 시도해보십시오.
  3. db 컬럼 이름이 아닌 특성 이름을 사용하고 있는지 확인하십시오.
+0

정말 대단합니다. - 고마워요. :) – Jen