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>();
È stato utile?

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
scroll top