NHibernate 쿼리 최적화: 성공적인 최신 응답으로 요청 검색
이 기사는 가장 최근의 Request
이 성공을 나타내는 Response
엔터티를 검색하는 효율적인 NHibernate 쿼리를 보여줍니다. 우리의 데이터 모델에는 Request
엔터티 컬렉션이 있는 Response
엔터티가 포함되어 있습니다. 각 Response
에는 Timestamp
및 부울 Success
속성이 있습니다.
이 솔루션은 향상된 가독성과 유지 관리를 위해 NHibernate의 QueryOver API를 사용하는 다단계 하위 쿼리 접근 방식을 사용합니다.
내부 하위 쿼리(maxSubquery
)는 그룹화 및 집계를 사용하여 각 Request
의 최대 타임스탬프를 식별합니다. 그런 다음 두 번째 하위 쿼리(successSubquery
)는 이러한 최대 타임스탬프를 필터링하여 해당 Request
가 Response
를 trueSuccess
로 표시한
마지막으로 외부 쿼리는 Request
항목을 검색하여 successSubquery
에서 식별된 ID를 기준으로 결과를 필터링합니다. 이렇게 하면 최근 응답이 성공적으로 완료된 요청만 반환됩니다.
이 최적화된 쿼리를 구현하는 C# 코드는 다음과 같습니다.
<code class="language-csharp">Response responseAlias = null; var maxSubquery = QueryOver.Of<Response>() .SelectList(l => l .SelectGroup(r => r.RequestId) .SelectMax(r => r.Timestamp)) //Using Timestamp instead of DateTime for clarity .Where(r => r.RequestId == responseAlias.RequestId) .Where(Restrictions.EqProperty( Projections.Max<Response>(r => r.Timestamp), Projections.Property(() => responseAlias.Timestamp))); var successSubquery = QueryOver.Of<Response>(() => responseAlias) .Select(r => r.RequestId) .WithSubquery .WhereExists(maxSubquery) .Where(r => r.Success); //Simplified Success check var query = session.QueryOver<Request>(); query.WithSubquery .WhereProperty(r => r.Id) // Assuming Id is the primary key .In(successSubquery); var requestsWithSuccessfulLatestResponses = query .List<Request>();</code>
이 접근 방식은 필요한 데이터를 효율적으로 검색하여 복잡한 데이터 관계를 처리하고 쿼리 최적화에 있어 NHibernate의 능력을 보여줍니다. 별칭을 사용하면 가독성이 향상되고 명확성을 위해 코드가 간소화됩니다. 일관성을 위해 Timestamp
대신 DateTime
을 사용하세요.
위 내용은 NHibernate를 사용하여 성공적인 최신 응답으로 요청을 효율적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!