Hola StackOverflow,NHibernate - Unión tres QueryOvers
me encontré con este problema que tienen tres QueryOvers y cada uno de ellos devuelve una lista de identificadores de candidatos que luego utilizo para llevar a los candidatos. Para esto escribí el siguiente código.
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))));
}
Esto devuelve los resultados correctos y la consulta generada se parece a esto
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**))
El problema es que utiliza 'o'. Debido a esto, la consulta es dolorosamente lenta.
Si en vez escribo esto:
SELECT *
FROM Applicants
WHERE IsActive = 1
and (Id in (SELECT Id from **FirstQueryOver**
union SELECT Id from **SecondQueryOver**
union SELECT Id from **ThirdQueryOver**))
Termina casi al instante.
¿Tiene alguna idea de cómo debería refactorizar el código para un mejor rendimiento?
Gracias, Adrian.
está haciendo una opción en memoria de la Unión? –
@ Andrew Whitaker me terminó haciendo justamente eso, pero realmente no me gusta porque hay registros devueltos por más de una consulta así que tengo que eliminar los duplicados de forma manual. –