Merhaba StackOverflow kullanıcılarınınNHibernate - Ben bu sorunu koştu Birliği üç QueryOvers
Üç QueryOvers var ve bunların her Sonra bu adayları getirmek için kullandıkları aday kimliklerinin bir listesini döndürür. Bunun için aşağıdaki kodu yazdım.
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))));
}
Bu, doğru sonuçlar verir ve bu
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**))
sorun kullandığı 'veya' olmasıdır gibi oluşturulan sorgu görünüyor. Bundan dolayı sorgu ağrılı bir şekilde yavaştır.
SELECT *
FROM Applicants
WHERE IsActive = 1
and (Id in (SELECT Id from **FirstQueryOver**
union SELECT Id from **SecondQueryOver**
union SELECT Id from **ThirdQueryOver**))
Neredeyse anında bitirir:
yerine ben yazıyorum.
Daha iyi performans için kodu nasıl yeniden gözden geçirmem gerektiğiyle ilgili bir fikriniz var mı?
Teşekkür ederiz, Adrian.
bir bellek içi Birliği bir seçenek mi yapıyor? –
@Andrew Whitaker Sadece bunu yapmayı bitirdim ama gerçekten hoşlanmıyorum çünkü birden fazla sorgu tarafından döndürülen kayıtlar var, bu yüzden çiftleri el ile ortadan kaldırmak zorundayım. –