NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)
摘要
这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似。首先创建IQueryOver对象,然后通过调用该对象的API函数,进行对象查询。这篇文章使用Query Over重写之前所有的查询。
本篇文章的代码可以到NHibernate查询下载
1、创建IQueryOver对象,返回所有Customer信息
public IList<Customer> QueryAllOver()
{
return Session.QueryOver<Customer>().List();
}
2、指定对象,返回数组
public IList<int> SelectIdOver()
{
return Session.QueryOver<Customer>()
.List<Customer>().Distinct().Select(c => c.Id).ToList();
}
3、添加查询条件
public IList<Customer> GetCustomerByNameOver(string firstName, string lastName)
{
return Session.QueryOver<Customer>().Where(c => c.FirstName == firstName && c.LastName == lastName).List();
}
另一个模糊查询的例子
public IList<Customer> GetCustomersStartWithOver()
{
//return Session.QueryOver<Customer>().Where(c => c.FirstName.StartsWith("J")).List(); //异常
//return Session.QueryOver<Customer>().Where(c => c.FirstName == "J%").List(); //正确
//return Session.QueryOver<Customer>().Where(Restrictions.On<Customer>(c => c.FirstName).IsLike("J%")).List(); //正确
return Session.QueryOver<Customer>().Where(Restrictions.Like("FirstName", "J%")).List();
}
上面第一句会报异常。使用Query OVer不能在lamda参数里调用所有.net自带类对象的方法,这里调用string类的方法抛出异常。也不能访问NHibernate实体对象的集合属性,例如不能在lamda表达式里访问c.Orders。
return Session.QueryOver<Customer>().Where(c => c.FirstName.StartsWith("J")).List(); //异常
4、order by
public IList<Customer> GetCustomersOrderByOver()
{
return Session.QueryOver<Customer>().OrderBy(c => c.FirstName).Desc().List();
}
对多个字段排序在第一个OrderBy方法调用后,调用ThenBy方法。
5、关联查询
public IList<OrderCount> SelectOrderCountOver()
{
var query = Session.QueryOver<Customer>()
.JoinQueryOver<Demo.XML.Entities.Domain.Order>(o => o.Orders) //关联查询,与Order对象关联,默认是inner join,可以调用重载方法指定join方式
.Select(Projections.GroupProperty("Id"), Projections.RowCount()) //分组查询
.TransformUsing(Transformers.AliasToBean<OrderCount>()); //将结果投影到OrderCount对象
return query.List<OrderCount>();
} /// <summary>
/// 查询所有订单数量大于2的客户信息
/// </summary>
/// <returns></returns>
public IList<Customer> GetCustomersOrderCountGreaterThanOver()
{
//分组查询
var query = Session.QueryOver<Customer>()
.JoinQueryOver<Demo.XML.Entities.Domain.Order>(o => o.Orders)
.Select(Projections.GroupProperty("Id"), Projections.RowCount());
IList<object[]> groups = query.List<object[]>();
//得到订单数大于2的Customer.Id
IList<int> ids = groups.Where(g => (int)g[] > ).Select(g => (int)g[]).ToList();
//条件查询
return Session.QueryOver<Customer>()
.Where(Restrictions.In("Id", ids.ToArray<int>()))
.List<Customer>();
} /// <summary>
/// 查询在指定日期到当前时间内有下订单的客户信息
/// </summary>
/// <param name="orderDate"></param>
/// <returns></returns>
public IList<Customer> GetCustomersOrderDateGreatThanOver(DateTime orderDate)
{
var query = Session.QueryOver<Customer>()
.JoinQueryOver<Demo.XML.Entities.Domain.Order>(o => o.Orders) //关联查询
.Where(o => o.Ordered > orderDate); //查询条件
return query.List<Customer>();
}
结语
NHibernate Query Over跟Criteria类似,不是很灵活,而且API很有限,我们只要理解基本用法就可以了。下篇文章介绍另一个人用得非常多的NHibernate查询:Native Query(SQL Query)。
NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)的更多相关文章
- NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)
摘要 NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系.比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产 ...
- NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)
摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...
- NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)
摘要 NHibernate在很早的版本就提供了SQL Query(原生SQL查询),对于很复杂的查询,如果使用其他的查询方式实现比较困难的时候,一般使用SQL Query.使用SQL Query是基于 ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)
摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...
- NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)
摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...
- NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)
摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...
- NHibernate系列文章二:创建NHibernate工程
摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...
- NHibernate系列文章二十一:延迟加载
摘要 NHibernate的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...
随机推荐
- [原创]cocos2d-x研习录-第三阶 特性之物理引擎
游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...
- virtual file system (VFS)
http://www.ibm.com/developerworks/library/l-virtual-filesystem-switch/ http://www.ibm.com/developerw ...
- photoshop,黑白转彩色单色
方法一: 打开 色相/饱和度 面板,勾选上 着色, 然后调节 明度 滑块. 方法二: 前面方法的缺点是会将修改直接塌陷到图层,如果想不塌陷,可以使用色相蒙板: 同样勾选 着色
- Centos6---Fail2ban
1.安装: rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm yum -y install ...
- ProcessOn
1.地址:http://www.processon.com/ 2.简介:在线创作流程图.BPMN.UML图.UI界面原型设计.iOS界面原型设计等. 3.优势:无需安装,简单易用.可以替代VISO,学 ...
- 集群工具ansible使用方法
ansible简介 ansible是与puppet.saltstack类似的集群管理工具,其优点是仅需要ssh和Python即可使用,而不像puppet.saltstack那样都需要客户端.与pupp ...
- 基于服务(Web Service)的文件管理Winform客户端实现(二)
上一篇主要介绍文件管理服务有哪些方法,实现了哪些功能. 基于服务(Web Service)的文件管理Winform客户端实现(一) 本篇将根据文件服务服务实现Winform客户端设计.开发. 3. ...
- LVM在线扩容
我虚拟机根分区已经使用了35%,现在需要对他进行在线扩容,扩容之后使用率降到30% [root@localhost ~]# dfFilesystem 1K-blocks Used Available ...
- 使用X-UA-Compatible来设置IE浏览器兼容模式(转)
使用X-UA-Compatible来设置IE浏览器兼容模式 文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. 前言 ...
- 设置maven默认的JDK版本
在pom文件中添加如下 : <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...