NHibernate - QueryOver Sorguları

Bu bölümde, QueryOver Sorgularını ele alacağız. Aşağıdaki sorguda gösterildiği gibi yöntem zinciri sözdizimini kullanan LINQ'ya daha çok benzeyen yeni bir sözdizimidir.

var customers = session.QueryOver<Customer>() .Where(x => x.FirstName == "Laverne");
  • Hala kapakların altındaki kriterler, ancak şimdi sorgularımız güçlü bir şekilde yazılmış durumda.

  • Ölçüt sorgusunda gördüğümüz gibi, ilk ad sadece opak bir dizedir, şimdi aslında bir x.FirstName, böylece ilk ad yeniden düzenlenir ve yeniden adlandırılır ve bu, sorgu kullanılarak bağlantı stili ölçütü sorgusunda değiştirilir.

  • Yine de pek çok benzer şey yapabiliriz, ancak sorgu anlama sözdizimini kullanamazsınız, yöntem zinciri sözdizimini kullanmanız gerekir ve bağlantı ile ölçütleri karıştırıp eşleştiremezsiniz.

  • Bir çok sorgu için, API üzerinden sorgu çok kullanışlıdır ve doğrudan Ölçüt kullanmaktan çok nesne sözdizimini anlamak çok daha kolaydır.

İlk adı Laverne olan bir müşteriyi bir sorgu kullanarak alacağımız basit bir örneğe bakalım.

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; 
      } 
   } 
}

Gördüğünüz gibi kapakların altında hala Kriterler var, ancak daha hoş bir sözdizimi.

Yukarıdaki kod derlendiğinde ve çalıştırıldığında, aşağıdaki çıktıyı göreceksiniz.

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...

Dezavantajlarından biri de şunu söylemek istiyoruz diyelim ki FirstName.StartsWith(“A”) aşağıdaki programda gösterildiği gibi.

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

tx.Commit();

Şimdi uygulamayı tekrar çalıştıralım ve bunun bir LINQ sağlayıcısı olmadığını göreceksiniz, çünkü bunun ne olduğunu bilmiyor StartsWith yöntem, yani bir RunTime exception.

İstisna, tanınmayan yöntem çağrısı diyor. Burada apaçık olanı yapıyoruz, ancak bu ille de işe yaramıyor.

Aşağıdaki kodda gösterildiği gibi FirstName'in "A%" ye eşit olması gibi başka bir şey deneyelim.

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

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

Bunu bir kez daha çalıştıralım ve aşağıda gösterildiği gibi herhangi bir sonucu geri almayacağımızı göreceksiniz.

Press <ENTER> to exit...

Bunu neden hiçbir sonuç alamadığımızı anlamak için NHibernate profil oluşturucusuna bir göz atalım.

Gördüğünüz gibi ilk ismin eşit olmayan% A olduğunu. Benzer işleci kullanılarak SQL'de bir% kullanılır. Şimdi aşağıdaki programda gösterildiği gibi WHERE cümlesine bir kısıtlama oluşturmamız gerekiyor.

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

Uygulamanızı tekrar çalıştıralım ve göreceksiniz ki, tüm müşterilerin adı A ile başlıyor.

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

Bu yenisini kullanmak dışında, daha önce olduğu gibi çalışır. QueryOversözdizimi. Pek çok geliştirici, LINQ sözdiziminin daha ulaşılabilir olduğunu ve çoğu zaman doğru şeyleri yaptığını görmektedir.

LINQ bunu kaldıramazsa, daha uygun olup olmayacağını görmek için HQL veya Kriterlere bakmaya başlayacaksınız.

Sadece size farklı bir sözdizimi verir, bu nedenle Kriterler, hem yaratma ölçütü hem de QueryOver, NHibernate kullanarak veri tabanından veri çekmenize izin veren başka bir sorgulama mekanizması sağlar.