2009-12-16 2 views
0

이 부분을 우연히 만났습니다. ==) (자기 참조 부모에 의해 필터링 기준을 추가 하시겠습니까?

public class Folder 
{ 
    public IList<Folder> ParentFolders{get;set;} 
} 

내가 루트 폴더를 끌어 쿼리 (ParentFolders.Count이 즉, 폴더를 만들 수 찾고 있어요 : 나는 많은 자기 참조 관계 (FluentNH)에 많은 주어진 클래스 매핑이 0). 자체 참조는 조회 테이블을 통해 수행되므로 ParentFolderID는 클래스에서 실제로 액세스 할 수 없습니다 (매핑에만 표시됨).

public IList<Folder> GetRootFolders() 
{ 
    return session.CreateCriteria<Folder>() 
     .outofideas() 
     .List<Folder>(); 
} 

룩업 테이블을 통한 자기 참조 계층 구조에 대한 도움이나 생각은 크게 감사하겠습니다. 테이블 자체는 유산이며 수정할 수 없습니다.

답변

0

는 :

<bag name="ParentFolders" table="FolderFolder" lazy="true"> 
    <key column="FolderID"/> 
    <many-to-many class="Folder" column="ParentFolderID"/> 
</bag> 

다음을 당신이 작성하는 경우 :

var folders = Session.CreateCriteria<Folder>("folder") 
    .Add(Restrictions.IsEmpty("ParentFolders")).List<Folder>(); 

이 SQL 얻을 것이다 : 나는 믿고

SELECT * 
FROM Folder folder 
WHERE not exists (select 1 from FolderFolder where folder.FolderID=FolderID) 

트릭을 수행을 .

0

나는 항상 NHibernate의 Criteria을 사용하기가 어렵다. (즉, 심지어 더 이상 NHibernate의 나머지보다 어렵습니다.) 대신 HQL 쿼리를 작성보십시오. 매핑 파일을 보지 않고 당신을 위해 쿼리를 쓸 수 있지만, 그것은 무언가 같이 될 것이다 : 당신은 조금, 내가 메모리에서이 쓰고 있어요 구문 함께 놀러해야 할 것

session.CreateQuery("FROM Folder f WHERE COUNT(f.ParentFolders) = 0") 

. NHibernate가 COUNT에 대한 하위 쿼리를 수행 할만큼 똑똑하다는 사실에 주목하십시오. 실제로 부모 폴더를 모두로드하지 않고 ,을 계산합니다. 당신의 매핑이 같은 경우