NHibernate - แบบสอบถามเกณฑ์

ในบทนี้เราจะกล่าวถึงกลไกการสืบค้นเกณฑ์ NHibernate Query by Criteria API ช่วยให้คุณสร้างแบบสอบถามโดยจัดการกับวัตถุเกณฑ์ในขณะรันไทม์

  • วิธีนี้ช่วยให้คุณระบุข้อ จำกัด แบบไดนามิกโดยไม่ต้องมีการปรับแต่งสตริงโดยตรง แต่จะไม่สูญเสียความยืดหยุ่นหรือพลังของ HQL ไปมากนัก

  • ในทางกลับกันแบบสอบถามที่แสดงเป็นเกณฑ์มักจะอ่านได้น้อยกว่าแบบสอบถามที่แสดงใน HQL

  • ไวยากรณ์ของเกณฑ์คลาสสิกคือ API การสืบค้นตามวัตถุดังที่แสดงในโปรแกรมต่อไปนี้

var customers = session.CreateCriteria<Customer>().Add(Restrictions.Like("FirstName", "H%"));
  • อย่างที่คุณเห็นเรากำลังทำเซสชันสร้างเกณฑ์สำหรับลูกค้าและตอนนี้เรากำลังเพิ่มวัตถุข้อ จำกัด ในการสืบค้นนั้น

  • สิ่งนี้มีประโยชน์สำหรับหน้าแบบสอบถามที่ผู้ใช้สามารถเลือกตัวเลือกบางอย่าง แต่ไม่สามารถเลือกตัวเลือกอื่นได้

  • ง่ายกว่าที่จะสร้างแบบสอบถามเป็นประเภทของต้นไม้เช่นโครงสร้างแบบสอบถามแทนที่จะเป็นใน HQL หรือ LINQ ซึ่งคุณสามารถใช้คำสั่ง AND หรือ OR ในส่วนคำสั่ง WHERE ได้

  • ง่ายกว่าเพียงเพิ่มข้อ จำกัด เพิ่มเติมโดยใช้วัตถุเกณฑ์เหล่านี้

มาดูตัวอย่างง่ายๆที่เราจะสร้างแบบสอบถามและเข้าถึงเกณฑ์ API ผ่าน createCriteria จากนั้นเพิ่มข้อ จำกัด ที่ชื่อเริ่มต้นด้วย H.

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.CreateCriteria<Customer>() 
               .Add(Restrictions.Like("FirstName", "H%")); 
         
            foreach (var customer in customers.List<Customer>()) { 
               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; 
      } 
   } 
}

เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้

Herman Crooks (4ead3480-6bce-11e1-b15c-6cf049ee52be)
   Points: 74
   HasGoldStatus: True
   MemberSince: 12/3/2010 12:00:00 AM (Utc)
   CreditRating: Neutral
   AverageRating: 0

   Orders:
      Order Id: 4ead3480-6bce-11e1-b15d-6cf049ee52be
      Order Id: 4ead3480-6bce-11e1-b15e-6cf049ee52be
      Order Id: 4ead3480-6bce-11e1-b15f-6cf049ee52be
      Order Id: 4ead3480-6bce-11e1-b160-6cf049ee52be
      Order Id: 4ead3480-6bce-11e1-b161-6cf049ee52be
      Order Id: 4ead3480-6bce-11e1-b162-6cf049ee52be
      Order Id: 4ead3480-6bce-11e1-b163-6cf049ee52be

Hudson Bins (4ec03f80-6bce-11e1-b2b7-6cf049ee52be)
   Points: 56
   HasGoldStatus: False
   MemberSince: 10/20/2008 12:00:00 AM (Utc)
   CreditRating: Terrible
   AverageRating: 0

   Orders:
      Order Id: 4ec03f80-6bce-11e1-b2b8-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2b9-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2ba-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2bb-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2bc-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2bd-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2be-6cf049ee52be
      Order Id: 4ec03f80-6bce-11e1-b2bf-6cf049ee52be

Hettie Feest (4ec50240-6bce-11e1-b300-6cf049ee52be)
   Points: 82
   HasGoldStatus: False
   MemberSince: 4/10/2009 12:00:00 AM (Utc)
   CreditRating: Neutral
   AverageRating: 0

   Orders:
      Order Id: 4ec50240-6bce-11e1-b301-6cf049ee52be
      Order Id: 4ec50240-6bce-11e1-b302-6cf049ee52be
      Order Id: 4ec50240-6bce-11e1-b303-6cf049ee52be
		
Press <ENTER> to exit…

มาดูตัวอย่างง่ายๆอีกตัวอย่างหนึ่งซึ่งเราจะดึงข้อมูลลูกค้าที่มีชื่อเท่ากับ "Laverne"

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.CreateCriteria<Customer>() 
               .Add(Restrictions.Eq("FirstName", "Laverne")) .List<Customer>(); 
            
            foreach (var customer in customers) {
               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; 
      } 
   } 
}

ลองเรียกใช้แอปพลิเคชันนี้อีกครั้งและคุณจะเห็นผลลัพธ์ต่อไปนี้

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

ตอนนี้หนึ่งในข้อเสียที่สำคัญของเกณฑ์ API คือสตริงทึบแสงเหล่านี้ในชื่อคุณสมบัติ ดังนั้นหากชื่อแรกถูก refactored เป็นอย่างอื่นเครื่องมือ refactoring ก็ไม่จำเป็นต้องเลือกสตริงทึบแสง