Fai contare i bambini con restrizioni utilizzando QueryOver su NHibernate
-
27-10-2019 - |
Domanda
Come posso eseguire le seguenti operazioni utilizzando QueryOver e nessun campo formula.
Ho la seguente relazione genitore / figlio
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;}
}
Ho la seguente query che restituisce 15 club e trasforma i risultati in un DTO, devo aggiungere a questa query un RowCount di abbonamenti che appartengono a ciascun club e che non sono stati annullati.
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>();
Soluzione
Dopo ulteriori ricerche, questa è la query risultante che funziona:
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>();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow