2011-04-12 2 views
0

오브젝트 테이블과 오브젝트 별명 테이블이 있습니다. 모든 가져 오는 기본 저장소에서 다음nhibernate 콜렉션 세트 페치 조인을 사용하여 n + 1 선택 및 중복 행을 피하십시오.

<class name="Object" table="Object" lazy="false"> 
    ... 
    properties... 
    ... 
    <set name="Aliases" table="Aliases" inverse="true" lazy="false" fetch="join" > 
     <key column="ObjectId" /> 
     <element column="Name" type="String"/> 
    </set> 
    ... 
</class> 

session.CreateCriteria(typeof (T)).List<T>(); 

: 나는이 같은 모음을 매핑하면

object.Aliases 

:

별명을 문자열 단지 설정 모음입니다 개체는 각 별칭에 대해 중복을 반환합니다. 왜? 목록에서 중복 된 객체를 제거하려면 어떻게해야합니까?

감사합니다.

EDIT : 매핑이 업데이트되었지만 그게 모두 매핑입니다. 별칭은 내가이 혼란 한

<set name="Aliases" batch-size="10" ... 
+0

선택 n + 1 또는 중복에 대해 묻고 있습니까? 아니면 둘다? – Rippo

+0

조금 더 많은 정보, 두 테이블의 코드 및 매핑을 게시 할 수 있습니까? – Rippo

+0

n + 1 select를 제외시키기 위해 적절한 매핑을 요청하고 중복을 반환하지 않습니다. fetch = "join"을 제거하면 결과에 중복이 없지만 n + 1 선택 문제가 있습니다. fetch = "join"을 남겨두면 단 하나의 선택 만 있지만 중복 된 문제가 발생합니다. 매핑의 경우 해당 부분 만 ... 그러나 더 자세한 설명으로 업데이트하겠습니다. –

답변

1

당신의 매핑에 batch-size="10"을 추가 선택 N + 1 개 문제에 대한 ISet<string> Object.Aliases

+0

이 방법은 '데카르트'제품을 제공하므로주의하십시오. 유스 케이스에 따라 이것은 바람직하지 않을 수도있다. – Rippo

+0

포인터를 가져 주셔서 감사합니다. 나는 클라이언트 측'List () .Distinct ()'Transformers.DistinctRootEntity'도 클라이언트 쪽에서 사용하지만 마침내 Criteria 객체 작성을 망치고 싶지는 않습니다. 내 마지막 해결책은 : 'return new list (base.GetAll(). Distinct ()); 중요 : Discinct()를 호출 할 때 equals()를 정의해야하지만, 클래스가 이미 그것을 가지고 있기 때문에 이것은 convinient –

0

에로드 될 필요가 문자열의 단지 세트의대로 자신의 클래스의이 없습니다 , 너무 때 NHibernate를 사용하기 시작했다. 그것이 작동하는 방법입니다. 매핑에는 fetch="join"이 포함되어 있으므로 부모 테이블과 자식 테이블간에 SQL JOIN을 사용하므로 각 자식에 대해 부모 데이터가 반복됩니다. 그러나 부모의 추가 인스턴스를 필터링하는 대신 쿼리의 행당 하나의 개체가있는 컬렉션을 가져옵니다. 별개의 객체가 필요함을 나타낼 필요가 있습니다. ICriteria 구문을 사용하면 Transformers.DistinctRootEntity을 쿼리에 추가 할 수 있습니다.

Get Distinct result set from NHibernate using Criteria API?을 참조하고 여기에 언급 된 링크를 참조하십시오.

+0

이것은 거의 해결책입니다. 그것을 지적! 나는 그것이 n + 1 선택을 풀기 때문에 거의 말하고있다. 불행히도 별칭을 채울 필요가있는 ~ 970 개 개체가 있고 batch-size = "100"을 넣으면 결과 쿼리가 큽니다. 로그에 0.5MB의 텍스트 (총 10 개 쿼리). 이것은 fetch = "join"case와 비교할 때 거대합니다. 그래서 제가보기에는 제가 DISTINCT를 join에 적용 할 수있을 것이라고 생각합니다. –