>백엔드 개발 >C++ >NHibernate를 사용하여 성공적인 최신 응답으로 요청을 효율적으로 검색하는 방법은 무엇입니까?

NHibernate를 사용하여 성공적인 최신 응답으로 요청을 효율적으로 검색하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-15 07:53:14906검색

How to Efficiently Retrieve Requests with Successful Latest Responses Using NHibernate?

NHibernate 쿼리 최적화: 성공적인 최신 응답으로 요청 검색

이 기사는 가장 최근의 Request이 성공을 나타내는 Response 엔터티를 검색하는 효율적인 NHibernate 쿼리를 보여줍니다. 우리의 데이터 모델에는 Request 엔터티 컬렉션이 있는 Response 엔터티가 포함되어 있습니다. 각 Response에는 Timestamp 및 부울 Success 속성이 있습니다.

이 솔루션은 향상된 가독성과 유지 관리를 위해 NHibernate의 QueryOver API를 사용하는 다단계 하위 쿼리 접근 방식을 사용합니다.

내부 하위 쿼리(maxSubquery)는 그룹화 및 집계를 사용하여 각 Request의 최대 타임스탬프를 식별합니다. 그런 다음 두 번째 하위 쿼리(successSubquery)는 이러한 최대 타임스탬프를 필터링하여 해당 RequestResponse를 trueSuccess로 표시한

ID만 선택합니다.

마지막으로 외부 쿼리는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.