Hallo Stackoverflow Benutzer,NHibernate - Union drei QueryOvers
ich in dieses Problem lief Ich habe drei QueryOvers und jeder von ihnen gibt eine Liste von Kandidaten-IDs, die ich dann diese Kandidaten bringen verwenden. Dafür habe ich den folgenden Code geschrieben.
private IQueryOver<CandidateEntity, CandidateEntity> UnionPublicWithPrivateCandidates(
IQueryOver<CandidateEntity, CandidateEntity> publicCandidates,
IQueryOver<CandidateEntity, CandidateEntity> privateCandidate,
IQueryOver<CandidateEntity, CandidateEntity> candidatesByUserRole)
{
return ActiveCandidatesQueryOver.Where(Restrictions.Disjunction()
.Add(Subqueries
.WhereProperty<CandidateEntity>(c => c.Id)
.In((QueryOver<CandidateEntity>)publicCandidates.Select(c => c.Id)))
.Add(Subqueries
.WhereProperty<CandidateEntity>(c => c.Id)
.In((QueryOver<CandidateEntity>)privateCandidate.Select(c => c.Id)))
.Add(Subqueries
.WhereProperty<CandidateEntity>(c => c.Id)
.In((QueryOver<CandidateEntity>)candidatesByUserRole.Select(c => c.Id))));
}
Dies gibt die korrekten Ergebnisse und die erzeugte Abfrage sieht wie folgt aus
SELECT *
FROM Applicants
WHERE IsActive = 1
and (Id in (SELECT Id from **FirstQueryOver**)
**or** Id in (SELECT Id from **SecondQueryOver**)
**or** Id in (SELECT Id from **ThirdQueryOver**))
Das Problem ist, dass es verwendet ‚oder‘. Aus diesem Grund ist die Abfrage sehr langsam.
Wenn stattdessen ich dies schreibe:
SELECT *
FROM Applicants
WHERE IsActive = 1
and (Id in (SELECT Id from **FirstQueryOver**
union SELECT Id from **SecondQueryOver**
union SELECT Id from **ThirdQueryOver**))
Es ist fast sofort beendet.
Haben Sie eine Idee, wie sollte ich den Code für eine bessere Leistung umgestalten?
Vielen Dank, Adrian.
macht eine In-Memory-Union eine Option? –
@Andrew Whitaker Ich habe genau das gemacht, aber ich mag es nicht wirklich, weil es Datensätze gibt, die von mehr als einer Abfrage zurückgegeben werden, so dass ich die Duplikate manuell eliminieren muss. –