Mengoptimumkan Pertanyaan NHibernate: Mendapatkan semula Permintaan dengan Respons Terkini yang Berjaya
Artikel ini menunjukkan pertanyaan NHibernate yang cekap untuk mendapatkan Request
entiti di mana Response
terbaharu menunjukkan kejayaan. Model data kami termasuk entiti Request
dengan koleksi Response
entiti. Setiap Response
mempunyai sifat Timestamp
dan boolean Success
.
Penyelesaian ini menggunakan pendekatan subkueri berbilang peringkat menggunakan API QueryOver NHibernate untuk kebolehbacaan dan kebolehselenggaraan yang dipertingkatkan.
Subkueri dalam (maxSubquery
) mengenal pasti cap masa maksimum untuk setiap Request
menggunakan pengumpulan dan pengagregatan. Subkueri kedua (successSubquery
) kemudian menapis cap masa maksimum ini, memilih hanya Request
ID yang mana Response
yang sepadan menandakan Success
sebagai benar.
Akhir sekali, pertanyaan luar mendapatkan semula entiti Request
, menapis hasil berdasarkan ID yang dikenal pasti dalam successSubquery
. Ini memastikan bahawa hanya permintaan dengan respons terkini yang berjaya dilengkapkan dikembalikan.
Berikut ialah kod C# yang melaksanakan pertanyaan yang dioptimumkan ini:
<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>
Pendekatan ini mendapatkan semula data yang diperlukan dengan cekap, mempamerkan kuasa NHibernate dalam mengendalikan perhubungan data yang kompleks dan pengoptimuman pertanyaan. Penggunaan alias meningkatkan kebolehbacaan, dan kod diperkemas untuk kejelasan. Perhatikan penggunaan Timestamp
dan bukannya DateTime
untuk konsistensi.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Permintaan dengan Cekap dengan Respons Terkini yang Berjaya Menggunakan NHibernate?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!