2011-04-26 2 views
3

나는이 코드를 사용하여 모든 가능한 그룹을 가져옵니다. 내가 가진 문제는 아이들도 사용할 수 없게되지만 유창한 nhibernate가 모두 아이들이 활성화 된 그룹 만 가져올 수는 없다는 것입니다. 나는 이것이 가능하다고 생각하지만 어떻게?NHibernate - 하위 속성을 기반으로 결과를 필터링

public class Group { 
    public bool IsDisabled { get; set; } 
    public string Description { get; set; } 
    public ICollection<ChildType> Children { get; protected set; } 
} 

public class ChildType { 
    public bool IsDisabled { get; set; } 
    public string Description { get; set; } 
} 

public IList<Group> Search(string searchString) { 
    IQueryOver<Group> query = Session.QueryOver<Group>() 
     .WhereRestrictionOn(x => x.Description).IsInsensitiveLike(searchString, MatchMode.Start) 
     .Where(x => !x.IsDisabled) 
     .OrderBy(x => x.Description).Asc 
     .Fetch(group => group.Children).Eager; 

    return query 
     .Cacheable() 
     .List(); 
} 

편집 : 아이들과 그룹 사이의 M-관계 :는 N있다. 당신이 원하는 일을해야

public class Group { 
    public long Id { get; set; } 
    public bool IsDisabled { get; set; } 
    public string Description { get; set; } 
    public ICollection<ChildType> Children { get; protected set; } 
} 

public class ChildType { 
    public long Id { get; set; } 
    public bool IsDisabled { get; set; } 
    public string Description { get; set; } 
    public ICollection<Group> Groups { get; protected set; } 
} 

public IList<Group> Search(string searchString) { 
    ChildType child = null; 
    Group group = null; 
    Group joinedGroup = null; 

    var notDisabled = Session.QueryOver.Of<ExaminationType>() 
     .Where(x => x.IsDisabled) 
     .JoinAlias(x => x.Groups,() => joinedGroup) 
      .Where(x => joinedGroup == group) 
     .Select(x => x.Id); 

    IQueryOver<Group> query = Session.QueryOver<Group>() 
     .WhereRestrictionOn(x => x.Description).IsInsensitiveLike(searchString, MatchMode.Start) 
     .JoinAlias(x => x.ExaminationTypes,() => child) 
     .WithSubquery.WhereNotExists(notDisabled) 
     .OrderBy(x => x.Description).Asc; 

    return query 
     .Cacheable() 
     .List(); 
} 

답변

5

당신은 당신이 원하는 것을 달성하기 위해 하위 쿼리를 사용해야합니다. 이렇게하려면 ChildType 엔터티에 Group 참조를 추가해야합니다.

Group group = null; 
var childCrit = QueryOver.Of<ChildType>() 
     .Where(c => c.Group == group).And(c => c.IsDisabled) 
     .Select(c => c.Id); 
var query = Session.QueryOver(() => group) 
     .WhereRestrictionOn(x => x.Description).IsInsensitiveLike(searchString, MatchMode.Start) 
     .Where(x => !x.IsDisabled) 
     .WithSubquery.WhereNotExists(childCrit) 
     .OrderBy(x => x.Description).Asc 
     .Fetch(group => group.Children).Eager; 

이렇게하면 사용 중지되지 않고 비활성화 된 자식이없는 모든 그룹이 생성됩니다.

+0

하위 그룹과 하위 그룹 사이에 N : M- 관계가 있습니다. 하위 쿼리를 약간 짜증나게 만들지 만 해결한다면이 방법을 사용합니다. 감사합니다. –

+0

하위 쿼리의 경우 투영을 수행하는 데 '선택'만 사용해야합니다. – Vadim

1
public IList<Group> Search(string searchString) { 

    Children children = null; 

    IQueryOver<Group> query = Session.QueryOver<Group>() 
     .WhereRestrictionOn(x => x.Description).IsInsensitiveLike(searchString, MatchMode.Start) 
     .Where(x => !x.IsDisabled) 
     .JoinAlias(x => x.Children,() => children) 
      .Where(x => !x.IsDisabled) 
     .OrderBy(x => x.Description).Asc; 

    return query 
     .Cacheable() 
     .List(); 
} 

:

다음은 내가 사용하는 솔루션입니다.

별칭에 가입하면 가져올 수도 있습니다.

http://www.philliphaydon.com/2011/04/nhibernate-querying-relationships-are-depth/

+0

변경 한 후 어디에요 (X =>! x.IsDisabled) 내가 어느 정도 일을 가지고 어디에요 (X =>! children.IsDisabled) 을하지만 그룹을 얻을 ** 어떤 **의 경우 ** 모든 아이들이 ** 가능하다면 아이들은 가능합니다. –

+0

@Fredrik - 오, 죄송합니다. 잘못 읽었습니다. 나는 당신이 존재를해야만 할 것이므로, 비활성화 된 것들이없이 활성화 된 모든 자식들에 대해 질의하고 Group을 리턴 한 다음 이전 질의에 WithSubquery.Exists 그룹을 질의한다. http://www.philliphaydon.com/2011/01/revisiting-exists-in-nhibernate-3-0-and-queryover/ - 나는 내일 일해야하기 때문에 정말로 잠을 자야한다. 그러면 쿼리가보고 응답합니다. – Phill

+0

도움을 주셔서 감사합니다.하지만 Vadim이 제안한 솔루션을 사용했습니다. –

관련 문제