NHibernate - QueryOver Queries

Di bab ini, kita akan membahas QueryOver Queries. Ini adalah sintaks baru yang lebih seperti LINQ menggunakan sintaks rantai metode seperti yang ditunjukkan pada kueri berikut.

var customers = session.QueryOver<Customer>() .Where(x => x.FirstName == "Laverne");
  • Ini masih kriteria di bawah sampul, tetapi sekarang kueri kami sangat diketik.

  • Seperti yang telah kita lihat di kueri kriteria, nama depan hanyalah string buram, sekarang kita sebenarnya menggunakan x.FirstName, sehingga nama depan difaktorkan ulang dan diganti namanya yang diubah dalam kueri kriteria gaya tautan menggunakan kueri di atas.

  • Kami masih dapat melakukan banyak hal serupa, tetapi Anda tidak dapat menggunakan sintaks pemahaman kueri dengan kueri berakhir, Anda harus menggunakan sintaks rantai metode dan Anda tidak dapat mencampur dan mencocokkan tautan dan kriteria.

  • Untuk banyak kueri, kueri melalui API sangat berguna dan menyediakan sintaks objek yang jauh lebih mudah dipahami daripada menggunakan Kriteria secara langsung.

Mari kita lihat contoh sederhana di mana kita akan mengambil pelanggan yang nama depannya adalah Laverne menggunakan kueri.

using System; 
using System.Data; 
using System.Linq; 
using System.Reflection; 

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Criterion; 
using NHibernate.Dialect; 
using NHibernate.Driver; 
using NHibernate.Linq;

namespace NHibernateDemo { 

   internal class Program { 
      
      private static void Main() { 
		
         var cfg = ConfigureNHibernate(); 
         var sessionFactory = cfg.BuildSessionFactory();
         using(var session = sessionFactory.OpenSession()) 
         
         using(var tx = session.BeginTransaction()) { 
            var customers = session.QueryOver<Customer>() 
               .Where(x => x.FirstName == "Laverne"); 
            
            foreach (var customer in customers.List()) { 
               Console.WriteLine(customer); 
            } 
				
            tx.Commit(); 
         }
			
         Console.WriteLine("Press <ENTER> to exit..."); 
         Console.ReadLine(); 
      }
      
      private static Configuration ConfigureNHibernate() { 
		
         NHibernateProfiler.Initialize();
         var cfg = new Configuration(); 
         
         cfg.DataBaseIntegration(x => { 
            x.ConnectionStringName = "default"; 
            x.Driver<SqlClientDriver>(); 
            x.Dialect<MsSql2008Dialect>(); 
            x.IsolationLevel = IsolationLevel.RepeatableRead; 
            x.Timeout = 10; 
            x.BatchSize = 10; 
         });
			
         cfg.SessionFactory().GenerateStatistics();
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         return cfg; 
      } 
   } 
}

Seperti yang Anda lihat, ini masih Kriteria di bawah sampul, tetapi hanya sintaks yang lebih bagus.

Ketika kode di atas dikompilasi dan dijalankan, Anda akan melihat output berikut.

Laverne Hegmann (4e97c816-6bce-11e1-b095-6cf049ee52be)
   Points: 74
   HasGoldStatus: True
   MemberSince: 4/4/2009 12:00:00 AM (Utc)
   CreditRating: Neutral
   AverageRating: 0

   Orders:
      Order Id: 4ea14d96-6bce-11e1-b095-6cf049ee52be
      Order Id: 4ea14d96-6bce-11e1-b096-6cf049ee52be
      Order Id: 4ea14d96-6bce-11e1-b097-6cf049ee52be
      Order Id: 4ea14d96-6bce-11e1-b098-6cf049ee52be
		
Press <ENTER> to exit...

Salah satu kekurangannya adalah, katakanlah kita ingin mengatakan itu FirstName.StartsWith(“A”) seperti yang ditunjukkan pada program berikut.

var customers = session.QueryOver<Customer>() .Where(x => x.FirstName.StartsWith("A"));
 
foreach (var customer in customers.List()) { 
   Console.WriteLine(customer); 
} 

tx.Commit();

Sekarang mari kita jalankan aplikasi lagi dan Anda akan melihat bahwa ini bukan penyedia LINQ karena tidak tahu apa ini StartsWith metode ini, jadi Anda akan mendapatkan file RunTime exception.

Pengecualian mengatakan panggilan metode tidak dikenal. Di sini kami melakukan hal yang jelas, tetapi belum tentu berhasil.

Mari kita coba yang lain, seperti FirstName sama dengan "A%" seperti yang ditunjukkan pada kode berikut.

var customers = session.QueryOver<Customer>() .Where(x => x.FirstName == "A%"); 

foreach (var customer in customers.List()) { 
   Console.WriteLine(customer); 
}

Mari kita jalankan ini sekali lagi dan Anda akan melihat bahwa kami tidak akan mendapatkan hasil apa pun kembali seperti yang ditunjukkan di bawah ini.

Press <ENTER> to exit...

Untuk memahami mengapa kami tidak mendapatkan hasil apa pun, mari kita lihat profiler NHibernate.

Seperti yang Anda lihat bahwa nama depan sama dengan A% yang bukan. A% digunakan dalam SQL menggunakan operator sejenis. Sekarang kita perlu membuat batasan ke klausa WHERE seperti yang ditunjukkan pada program berikut.

var customers = session.QueryOver<Customer>() 
   .Where(Restrictions.On<Customer>(c => c.FirstName).IsLike("A%")); 
	
foreach (var customer in customers.List()) { 
   Console.WriteLine(customer); 
}

Jalankan aplikasi Anda lagi dan Anda akan melihat bahwa semua pelanggan diambil dengan nama depan dimulai dengan A.

Alejandrin Will (4ea3aef6-6bce-11e1-b0b4-6cf049ee52be)
   Points: 24
   HasGoldStatus: False
   MemberSince: 10/1/2011 12:00:00 AM (Utc)
   CreditRating: VeryVeryGood
   AverageRating: 0

   Orders:
      Order Id: 4ea3aef6-6bce-11e1-b0b5-6cf049ee52be

Austyn Nolan (4ea871b6-6bce-11e1-b110-6cf049ee52be)
   Points: 67
   HasGoldStatus: True
   MemberSince: 12/29/2007 12:00:00 AM (Utc)
   CreditRating: Neutral
   AverageRating: 0

   Orders:
      Order Id: 4ea871b6-6bce-11e1-b111-6cf049ee52be

Antonia Murphy (4ea871b6-6bce-11e1-b121-6cf049ee52be)
   Points: 72
   HasGoldStatus: True
   MemberSince: 6/15/2009 12:00:00 AM (Utc)
   CreditRating: Terrible
   AverageRating: 0

   Orders:
      Order Id: 4ea871b6-6bce-11e1-b122-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b123-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b124-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b125-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b126-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b127-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b128-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b129-6cf049ee52be
      Order Id: 4ea871b6-6bce-11e1-b12a-6cf049ee52be

Ini bekerja dengan cara yang sama seperti sebelumnya, kecuali menggunakan yang baru ini QueryOversintaksis. Banyak pengembang menemukan bahwa sintaks LINQ lebih mudah didekati dan sering melakukan hal yang benar.

Jika LINQ tidak dapat menanganinya, maka Anda akan mulai melihat HQL atau Kriteria untuk melihat apakah itu lebih cocok.

Ini hanya memberi Anda sintaks yang berbeda, jadi Criteria, baik kriteria create maupun QueryOver memberi Anda mekanisme kueri lain yang memungkinkan Anda untuk menarik data keluar dari database menggunakan NHibernate.