开发手册 欢迎您!
软件开发者资料库

NHibernate - Linq

NHibernate Linq - 从概述,架构,Orm,环境设置,入门,基本Orm,基本Crud操作,Profiler,添加Intelliesnse到映射文件,数据类型映射,配置,覆盖配置,批量大小,缓存,映射组件开始学习NHibernate ,关系,集合映射,级联,延迟加载,反向关系,加载/获取,Linq,Hibernate查询语言,条件查询,QueryOver查询,本机Sql,流利Hibernate。

在本章中,我们将介绍人们将使用的另一个常见API是NHibernate LINQ提供程序.它通过ISession上的扩展方法和签名进行访问是 Query< T> .使用LINQ&minus时有两种语法;

  • 查询链接语法

  • 查询理解语法

查询链接语法

您可以使用方法链语法访问数据库中的任何记录,如下所示以下程序.

var customer = session.Query() .Where(c => c.FirstName == "Laverne")

  • 你可以看到我们有查询,还有WHERE子句,你可以有额外的WHERE子句和类似的select子句.

  • 这是一种标准的方法链语法,你可以在普通的LINQ中使用.

  • LINQ to Objects或LINQ to SQL,您可能熟悉的任何其他LINQ提供程序.

让我们看一个简单的例子,我们将检索名字为Laverne的客户.现在我们可能有多个客户的名字是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 customer = session.Query()                .Where(c => c.FirstName == "Laverne").First();             Console.WriteLine(customer);             tx.Commit();          }         Console.WriteLine("Press  to exit...");          Console.ReadLine();       }      private static Configuration ConfigureNHibernate() {          NHibernateProfiler.Initialize();          var cfg = new Configuration();                   cfg.DataBaseIntegration(x => {             x.ConnectionStringName = "default";             x.Driver();             x.Dialect();             x.IsolationLevel = IsolationLevel.RepeatableRead;             x.Timeout = 10;             x.BatchSize = 10;          });                   cfg.SessionFactory().GenerateStatistics();         cfg.AddAssembly(Assembly.GetExecutingAssembly());          return cfg;       }    } }

现在编译并执行上面的代码时,您将看到以下输出./p>

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-6cf049ee52bePress  to exit...

查询理解语法

还有查询理解语法,看起来更像SQL使用from,where和select关键字.

所以让我们看看同一个例子,但是这次我们使用LINQ comprehensions语法,它看起来更像SQL,如图所示以下程序.

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 customer = (from c in session.Query()                where c.FirstName == "Laverne" select c).First();            Console.WriteLine(customer);             tx.Commit();         }                  Console.WriteLine("Press  to exit...");          Console.ReadLine();       }            private static Configuration ConfigureNHibernate() {         NHibernateProfiler.Initialize();          var cfg = new Configuration();                   cfg.DataBaseIntegration(x => {             x.ConnectionStringName = "default";             x.Driver();             x.Dialect();             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-6cf049ee52bePress  to exit...

让我们看看另一个例子,我们将检索所有那些FirstName以字母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.Query() .Where(c =<               c.FirstName.StartsWith("H"));                        foreach (var customer in customers.ToList()) {                Console.WriteLine(customer);             }            tx.Commit();          }         Console.WriteLine("Press  to exit...");          Console.ReadLine();       }      private static Configuration ConfigureNHibernate() {          NHibernateProfiler.Initialize();          var cfg = new Configuration();                   cfg.DataBaseIntegration(x => {             x.ConnectionStringName = "default";             x.Driver();             x.Dialect();             x.IsolationLevel = IsolationLevel.RepeatableRead;             x.Timeout = 10;             x.BatchSize = 10;          });          cfg.SessionFactory().GenerateStatistics();         cfg.AddAssembly(Assembly.GetExecutingAssembly());          return cfg;       }    } }

同样,查询理解语法类似于以下程序.

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 = from c in session.Query()                where c.FirstName.StartsWith("H") select c;                        foreach (var customer in customers.ToList()) {                Console.WriteLine(customer);             }            tx.Commit();          }         Console.WriteLine("Press  to exit...");          Console.ReadLine();       }      private static Configuration ConfigureNHibernate() {          NHibernateProfiler.Initialize();          var cfg = new Configuration();                   cfg.DataBaseIntegration(x => {             x.ConnectionStringName = "default";             x.Driver();             x.Dialect();             x.IsolationLevel = IsolationLevel.RepeatableRead;             x.Timeout = 10;             x.BatchSize = 10;          });          cfg.SessionFactory().GenerateStatistics();         cfg.AddAssembly(Assembly.GetExecutingAssembly());          return cfg;       }    } }

让我们再次运行此应用程序,您将看到所有客户,其名字开头字母H.

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-6cf049ee52beHudson 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-6cf049ee52beHettie 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-6cf049ee52bePress  to exit...