2013-04-13 3 views

답변

0

LINQ

var filtered = 
    from a in session.Query<Album>() 
    from t in a.Tracks 
    where !t.Indices.Any() 
    select a.Id 

var results = session.Query<Album>() 
    .Where(a => filtered.Contains(a.Id)) 
    .Take(20) 
    .List() 

QueryOver

var results = session.QueryOver<Album>() 
    .WhereRestrictionOn(a => a.Id).IsIn(QueryOver.Of<Album>() 
     .JoinQueryOver(a => a.Tracks) 
      .Where(t => !t.Indices.Any()) 
     .Select(a => a.Id)) 
    .Take(20) 
    .List() 
0

내가 큰 Linq에 NHibernate에 대한 전문 아니에요하지만 난 당신을뿐만 아니라 도울 수있는 그 자 NHibernate를 조회 할 수있는 또 다른 방법이 알고 . QueryOver이라고합니다. Linq와 같은 멤버 식을 사용하는 강력한 형식의 쿼리 구문입니다. 바로 지금 QueryOver은 NHibernate 커뮤니티에서 훨씬 더 강력합니다. 왜냐하면 주로 조건 쿼리 (이는 꽤 오랫동안있었습니다)에 기반하기 때문입니다.

서로 다른 쿼리 언어에 대한 자세한 학습에 관심이 있다면 당신은이 사이트를 체크 아웃해야합니다 : NHibernate: Queries

나는 또한 내가 다른 플러그인과 당신이 NHibernate에 사용할 수있는 기술에 대한 기사를 블로그가 (방법을 포함하여 쿼리하려면) - My Blog

이하는 쿼리를 통해 찾고자하는 대상을 자세히 보여 주어야합니다.

Album a = null; 
Tracks t = null; 
Indices i = null; 
var query = session.GetQueryOver(() => a) 
    .JoinAlias(() => a.Tracks,() => t) 
    .JoinAlias(() => t.Indicies,() => i) 
    .Where(() => i.Indices.Count() == 0) 
    .Take(20) 
    .ToList() 
    ; 

추가 당신은 또한 메서드 호출에 유형 JoinType의 다른 매개 변수를 추가하여 조인 유형에서 지정할 수있는 쿼리에 조인. 예 :

.JoinAlias(() => a.Tracks,() => t, JoinType.LeftOuterJoin) 
+0

이 쿼리 오버 쿼리는 OP 설명과 동일한 문제가 있습니다. 테이크는 조인에 적용되며 앨범 20 개가 아니라 조인 행 20 개를 반환합니다. – Firo