2011-06-13 3 views
6

¿Cómo puedo hacer lo siguiente con QueryOver y sin campos de fórmula.Haga que los niños cuenten con restricciones utilizando QueryOver en NHibernate

tengo la relación siguiente padre/hijo

public class Club { 

public string Name {get; set;} 
public IList<Membership> Memberships {get; set;} 
} 

public class Membership { 

public boolean Cancelled {get; set;} 
public Club Club {get; set;} 
} 

tengo el siguiente consulta que devuelve 15 clubes y transforma los resultados a un DTO, tengo que añadir a esta consulta un RowCount de Pertenencia que pertenecen a cada club y que no están Cancelados.

IEnumerable<ClubIndexViewModelLineSummary> results = _querySession.QueryOver<Club>() 
        .OrderBy(c => c.IsActive).Desc 
        .OrderBy(c => c.Name).Asc 
        .SelectList(list => list 
              .Select(c => c.Id).WithAlias(() => sum.Id) 
              .Select(c => c.Name).WithAlias(() => sum.Name) 
              .Select(c => c.IsActive).WithAlias(() => sum.IsActive) 
              .Select(c => c.NumberOfWeeks).WithAlias(() => sum.NumberOfWeeks)) 
        .TransformUsing(Transformers.AliasToBean<ClubIndexViewModelLineSummary>()) 
        .Skip(start) 
        .Take(15) 
        .Future<ClubIndexViewModelLineSummary>(); 

Respuesta

9

Después de algunas investigaciones más, esta es la consulta resultante que funciona:

Club clubAlias = null; 

       IEnumerable<ClubIndexViewModelLineSummary> results = 
       _querySession.QueryOver<Club>(() => clubAlias) 
        .OrderBy(c => c.IsActive).Desc 
        .OrderBy(c => c.Name).Asc 
        .SelectList(list => list 
              .Select(c => c.Id).WithAlias(() => sum.Id) 
              .Select(c => c.Name).WithAlias(() => sum.Name) 
              .Select(c => c.IsActive).WithAlias(() => sum.IsActive) 
              .Select(c => c.NumberOfWeeks).WithAlias(() => sum.NumberOfWeeks) 
              .SelectSubQuery 
              (
               QueryOver.Of<ClubMembership>() 
                .Where(c => c.Canceled == false) 
                .And(c=> c.Club.Id == clubAlias.Id) 
                .ToRowCountQuery() 
              ).WithAlias(()=> sum.ActiveMembers)) 

        .TransformUsing(Transformers.AliasToBean<ClubIndexViewModelLineSummary>()) 
        .Skip(start) 
        .Take(15) 
        .Future<ClubIndexViewModelLineSummary>(); 
Cuestiones relacionadas