NHibernate: filtraggio dei risultati in base alla proprietà del bambino

Ho questo codice che recupera tutti i gruppi abilitati con i loro figli. Il problema che ho è che i bambini possono anche essere disabilitati, ma non riesco a diventare fluente da nibere solo per recuperare i gruppi in cui tutti i bambini sono abilitati. Presumo che sia ansible ma come?

public class Group { public bool IsDisabled { get; set; } public string Description { get; set; } public ICollection Children { get; protected set; } } public class ChildType { public bool IsDisabled { get; set; } public string Description { get; set; } } public IList Search(string searchString) { IQueryOver query = Session.QueryOver() .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(); } 

Modifica: esiste una relazione N: M tra bambini e gruppi.

La seguente è la soluzione che ho usato:

 public class Group { public long Id { get; set; } public bool IsDisabled { get; set; } public string Description { get; set; } public ICollection Children { get; protected set; } } public class ChildType { public long Id { get; set; } public bool IsDisabled { get; set; } public string Description { get; set; } public ICollection Groups { get; protected set; } } public IList Search(string searchString) { ChildType child = null; Group group = null; Group joinedGroup = null; var notDisabled = Session.QueryOver.Of() .Where(x => x.IsDisabled) .JoinAlias(x => x.Groups, () => joinedGroup ) .Where(x => joinedGroup == group) .Select(x => x.Id); IQueryOver query = Session.QueryOver() .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(); } 

Devi usare una subquery per ottenere ciò che vuoi. Per fare ciò, dovrai aggiungere un riferimento di gruppo all’ quadro ChildType.

 Group group = null; var childCrit = QueryOver.Of() .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; 

Questo otterrà tutti i gruppi che non sono disabilitati e non hanno figli disabili.

 public IList Search(string searchString) { Children children = null; IQueryOver query = Session.QueryOver() .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(); } 

Questo dovrebbe fare quello che vuoi fare.

Unire un alias lo preleva anche per te.

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