こんにちはStackOverflowのユーザー、NHibernateは - 連合3 QueryOvers
私は3 QueryOversを持っており、それらのそれぞれが、私はそれらの候補者をもたらすために使用する候補IDのリストを返すこの問題 に走りました。 これについては、私は次のコードを書いた。
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))));
}
問題は、それが「または」を使用することでこれが正しい結果を返し、生成されたクエリは、この
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**))
のように見えます。このため、クエリは非常に遅いです。
そうではなく、私はこれを書く:
SELECT *
FROM Applicants
WHERE IsActive = 1
and (Id in (SELECT Id from **FirstQueryOver**
union SELECT Id from **SecondQueryOver**
union SELECT Id from **ThirdQueryOver**))
それはほぼ瞬時に完了します。
パフォーマンス向上のためにコードをどのようにリファクタリングする必要がありますか?
ありがとう、 エイドリアン。
メモリ内ユニオンオプションを実行していますか? –
@Andrew Whitaker私はちょうどそれをやってしまったが、複数のクエリによって返されるレコードがあるので、私は手動で重複を排除する必要があるので、実際には好きではない。 –