2012-12-20 1 views
4

기준/세부 기준에 투사 :NHibernate에 : 나는 멤버가 클래스 모을 가지고

:

public virtual EventType Type { get; set; } 

클래스 EvenType는 회원이 : 클래스 이벤트는 멤버가

ICollection<Event> EventList 

public virtual int Id 

NHibernate 기준을 사용하여 1 또는 2의 ID를 가진 Mod의 모든 이벤트 목록을 얻고 싶습니다. 나는이 한 :

var subCriteria = DetachedCriteria.For<Mod>() 
    .Add(Restrictions.In("Event.Type", new int[] {1, 2 }) 
    ); 
criteria.Add(Subqueries.Exists(subCriteria)); 

을하지만 난 가 투사하지 않고 기준에 하위 쿼리를 사용할 수 없다는 런타임 오류가 발생합니다.

그래, 괜찮지 만 프로젝션에 무엇을 넣어야할지 모르겠다. 나는 투영법에 대한 예를 찾을 수 있지만 실제로 그 목적을 설명하는 것은 아무것도 없다. 다양한 시도를했지만 런타임 오류가 발생합니다.

메시지 : 값은 null 일 수 없습니다. 매개 변수 이름 : 키 출처 : mscorlib에 도움말 링크 : paramName에 :이 작동 할 때 나는 더 추가되기 때문에 하위 쿼리를 사용할 필요가

키를 누릅니다.

투영을 위해 무엇을 제안 할 수 있습니까? 여기에 기록으로

답변

7

는 : 16.4. Associations 그것은 다음과 같이 할 수있다 :

IQueryOver<Mod, Event> query = session 
    .QueryOver<Mod>() 
    .JoinQueryOver<Event>(mod => mod.EventList) 
    .WhereRestrictionOn(evnt => evnt.Type.Id).IsIn(new object[] { 1, 2}); 

var result = query.List<Mod>(); 

편집 : 순수한 기준 API :

var criteria = session.CreateCriteria<Mod>(); 
var sub = criteria.CreateCriteria("EventList", JoinType.LeftOuterJoin); 
    sub.Add(new InExpression("Type", new object[] { 1, 2 })); 

var result = criteria.List<Mod>(); 

분리 기준을 사용합니다. 이 경우 EventTypeModId 속성을 가져야하며 Mod 인스턴스를 참조해야합니다. 하위 쿼리에서 유효한 Mod.ID 목록을 반환해야합니다.

var sub = DetachedCriteria 
.For<Event>() 
.Add(Restrictions.In("Type", new int[] {1, 2 })) // WHERE 
.SetProjection(Projections.Property("ModId")); // Mod.ID the SELECT clause 

var criteria = session.CreateCriteria<Mod>(); 
criteria.Add(Subqueries.PropertyIn("ID", sub)); // Mod.ID in (select 
var result = criteria.List<Mod>(); 
+0

Radim, 응답 해 주셔서 감사합니다. 그래도 조건 쿼리를 사용해야합니다. – numberwang

+0

QueryOver가 Criteria API ... * "QueryOver api, Extension Methods 및 Lambda Expressions를 결합하여 ICriteria API의 정적 유형 보증 된 래퍼 제공 * * –

+0

다시 한 번 감사드립니다. 제 질문은 프로젝션에 관한 것입니다. 이미 기준 인스턴스가 있으므로 두 번째 예제에서와 같이 다른 인스턴스를 만들 수 없으며 최소한 기존 기준에 추가해야합니다. – numberwang

관련 문제