Memiliki Banyak Pertanyaan: Dapatkan permintaan dengan respons terkini yang berjaya
Pertimbangkan model pepejal berikut:
<code class="language-c#">public class Request { public virtual IList<Response> Responses { get; set; } } public class Response { public virtual DateTime Timestamp { get; set; } public virtual bool Success { get; set; } }</code>
Tugasnya adalah untuk membina pertanyaan yang mendapatkan semula semua permintaan yang berjaya dengan respons terkini (berdasarkan cap masa).
Penyelesaian NHibernate menggunakan QueryOver
NHibernate menyediakan penyelesaian komprehensif menggunakan QueryOver:
<code class="language-c#">Response responseAlias = null; var maxSubquery = QueryOver.Of<Response>() .SelectList(l => l .SelectGroup(item => item.RequestId) .SelectMax(item => item.Timestamp) // 使用 Timestamp 而不是 DateTime ) .Where(item => item.RequestId == responseAlias.RequestId) .Where(Restrictions.EqProperty( Projections.Max<Response>(item => item.Timestamp), // 使用 Timestamp 而不是 DateTime Projections.Property(() => responseAlias.Timestamp) // 使用 Timestamp 而不是 DateTime )); var successSubquery = QueryOver.Of<Response>(() => responseAlias) .Select(res => res.RequestId) .WithSubquery .WhereExists(maxSubquery) .Where(success => success.Success == true); var query = session.QueryOver<Request>(); query.WithSubquery .WhereProperty(r => r.ID) .In(successSubquery); var list = query.List<Request>();</code>
Pertanyaan ini mendapatkan semula semua permintaan yang mempunyai sekurang-kurangnya satu respons yang berjaya (terbaru berdasarkan cap masa). DateTime
telah digantikan dengan Timestamp
yang lebih tepat dalam kod, dan penamaan pembolehubah telah dilaraskan sedikit untuk meningkatkan kebolehbacaan. Logik teras tetap sama.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Permintaan dengan Respons Berjaya Terkini Menggunakan NHibernate?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!