NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

摘要

这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似。首先创建IQueryOver对象,然后通过调用该对象的API函数,进行对象查询。这篇文章使用Query Over重写之前所有的查询。

本篇文章的代码可以到NHibernate查询下载

1、创建IQueryOver对象,返回所有Customer信息

1         public IList<Customer> QueryAllOver()
2         {
3             return Session.QueryOver<Customer>().List();
4         }

2、指定对象,返回数组

1         public IList<int> SelectIdOver()
2         {
3             return Session.QueryOver<Customer>()
4                 .List<Customer>().Distinct().Select(c => c.Id).ToList();
5         }

3、添加查询条件

1         public IList<Customer> GetCustomerByNameOver(string firstName, string lastName)
2         {
3             return Session.QueryOver<Customer>().Where(c => c.FirstName == firstName && c.LastName == lastName).List();
4         }

另一个模糊查询的例子

1         public IList<Customer> GetCustomersStartWithOver()
2         {
3             //return Session.QueryOver<Customer>().Where(c => c.FirstName.StartsWith("J")).List();  //异常
4             //return Session.QueryOver<Customer>().Where(c => c.FirstName == "J%").List();  //正确
5             //return Session.QueryOver<Customer>().Where(Restrictions.On<Customer>(c => c.FirstName).IsLike("J%")).List();  //正确
6             return Session.QueryOver<Customer>().Where(Restrictions.Like("FirstName", "J%")).List();
7         }

上面第一句会报异常。使用Query OVer不能在lamda参数里调用所有.net自带类对象的方法,这里调用string类的方法抛出异常。也不能访问NHibernate实体对象的集合属性,例如不能在lamda表达式里访问c.Orders。

return Session.QueryOver<Customer>().Where(c => c.FirstName.StartsWith("J")).List();  //异常

4、order by

1         public IList<Customer> GetCustomersOrderByOver()
2         {
3             return Session.QueryOver<Customer>().OrderBy(c => c.FirstName).Desc().List();
4         }

对多个字段排序在第一个OrderBy方法调用后,调用ThenBy方法。

5、关联查询

 1         public IList<OrderCount> SelectOrderCountOver()
 2         {
 3             var query = Session.QueryOver<Customer>()
 4                 .JoinQueryOver<Demo.XML.Entities.Domain.Order>(o => o.Orders)    //关联查询,与Order对象关联,默认是inner join,可以调用重载方法指定join方式
 5                 .Select(Projections.GroupProperty("Id"), Projections.RowCount()) //分组查询
 6                 .TransformUsing(Transformers.AliasToBean<OrderCount>());         //将结果投影到OrderCount对象
 7             return query.List<OrderCount>();
 8         }
 9
10         /// <summary>
11         /// 查询所有订单数量大于2的客户信息
12         /// </summary>
13         /// <returns></returns>
14         public IList<Customer> GetCustomersOrderCountGreaterThanOver()
15         {
16             //分组查询
17             var query = Session.QueryOver<Customer>()
18                 .JoinQueryOver<Demo.XML.Entities.Domain.Order>(o => o.Orders)
19                 .Select(Projections.GroupProperty("Id"), Projections.RowCount());
20             IList<object[]> groups = query.List<object[]>();
21             //得到订单数大于2的Customer.Id
22             IList<int> ids = groups.Where(g => (int)g[1] > 2).Select(g => (int)g[0]).ToList();
23             //条件查询
24             return Session.QueryOver<Customer>()
25                        .Where(Restrictions.In("Id", ids.ToArray<int>()))
26                        .List<Customer>();
27         }
28
29         /// <summary>
30         /// 查询在指定日期到当前时间内有下订单的客户信息
31         /// </summary>
32         /// <param name="orderDate"></param>
33         /// <returns></returns>
34         public IList<Customer> GetCustomersOrderDateGreatThanOver(DateTime orderDate)
35         {
36             var query = Session.QueryOver<Customer>()
37                 .JoinQueryOver<Demo.XML.Entities.Domain.Order>(o => o.Orders)    //关联查询
38                 .Where(o => o.Ordered > orderDate);                              //查询条件
39             return query.List<Customer>();
40         }

结语

NHibernate Query Over跟Criteria类似,不是很灵活,而且API很有限,我们只要理解基本用法就可以了。下篇文章介绍另一个人用得非常多的NHibernate查询:Native Query(SQL Query)。

时间: 2024-10-13 00:45:39

NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)的相关文章

NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)

摘要 NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系.比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产品主要信息.这样能够显著提高产品的查询效率. 这篇文章的附件:NHibernate Demo下载. 1.建立ProductDetail表 这里将ProductId设置为主键. Product和ProductDetail之间的关系. ProductId既是主键又是外键. 创建ProductDetail

NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)

摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NHibernate重写之前所有的查询. 本篇文章的代码可以到NHibernate查询下载 1.创建IQueryable对象,返回所有Customer对象信息 1 public IList<Customer> QueryAllLinq() 2 { 3 return Session.Query<C

NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)

摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4.0又添加了Query Over.每种方式各有优缺点,任何一个SQL查询可以使用任何查询方式查询.根据程序员每种方式掌握的情况,可以使用不同的查询方式.本篇文章介绍HQL语言查询.HQL(Hibernate Query Language)是NHibernate特有的面向对象查询语言,他具有继承.多态的

NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping(附程序下载)

摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早最成熟的Mapping方法.其他的Mapping方法都是基于XML Mapping的思想进行的“变种”,要么暂时不能完全像XML Mapping那样功能丰富.其他的Mapping方法目前包括:Fluent Mapping.Attribute Mapping和Mapping by Convention

NHibernate系列文章二十一:延迟加载

摘要 NHibernate的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关联的对象上还有其他的关联对象,还要去查询其他的对象.如果这张“网”非常大,或者关联的数据库记录非常多的话,每次查询主表记录都要把整个数据库都查询一遍,这样效率会非常低下.为了解决这个问题产生了NHibernate延迟加载.对一些属性设置延迟加载,只在对象访问到这些属性的时候才去查询数据库,很大程度上

Java并发编程系列之二十五:线程池

线程池简介 在之前介绍Executor框架的文章中对线程池有一个初步的认识,实际上线程池这种设计思想在Java中很普遍,比如JVM中常量池,以及Web开发使用到的数据库连接池.这些池本质上还是Java中的对象池,因为池中存放的都是Java对象.回到线程池,几乎所有需要异步或者执行并发任务的程序都可以使用到线程池.使用线程池带来的好处主要包括以下几个方面: 一,提高资源利用率.由于线程池中的线程使可以重复利用的,所以达到了循环利用的目的 二,提高响应速度.由于线程的创建也是需要开销的,如果请求到来

Powershell管理系列(二十五)PowerShell操作之或者AD账号及邮箱信息

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 有时候我们需要查询账号的很多属性,但是需要通过不同的命令去获取,有点类似SQL Server里面的多表连接查询,比如查询所有账号的ad账号描述,邮箱名,显示名,邮箱地址,邮箱数目,邮箱大小,存档邮箱大小,存档邮箱数目. ad账号描述---对应AD账号的描述信息,通过Get-adUser 获取 邮箱名,显示名,邮箱地址---对应用户

Adrnoid开发系列(二十五):使用AlertDialog创建各种类型的对话框

AlertDialog能够生成各种内容的对话框.可是每种对话框都会有这样的的结构: 类似下边这样的的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这仅仅是最简单的对话框. 我们来看下创建一个对话框须要的步骤: 1.使用创建AlertDialog.Builder对

从Exchange 通往Office 365系列(二十五)混合部署概述

前期的准备都完成后,接下来我们就可以来配置混合部署了,首先先来了解下什么是混合部署 本地Exchange可以选择直接迁移到Office 365中,也可以选择配置为混合部署的模式,配置混合部署的模式可以有以下一些好处 内部部署组织与 Exchange Online 组织之间的安全邮件路由. 使用共享域命名空间的邮件路由.例如,内部部署与 Exchange Online 组织都使用 @contoso.com SMTP 域. 统一全局地址列表 (GAL),也称为"共享地址簿". 内部部署组织