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的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...
随机推荐
- 在skyDriver上保存代码
在家里写的代码, 有时候在公司也想打开改一改. 以前, 我都是使用优盘进行拷贝, 或者直接在优盘上进行操作. 有时, 忘了带优盘就傻眼了. 也想过直接托管到代码托管网站. 但主流的一些托管,都是要开源 ...
- ecs CentOS 7 安装 mysql (mariadb)
检查之前是否已经安装 rpm -qa | grep mariadb 如果已安装,卸载 yum remove mysql mysql-server mysql-libs compat-mysql51 开 ...
- MVC 下 JsonResult 的使用方法(JsonRequestBehavior.AllowGet)【转】
MVC 默认 Request 方式为Get. actionpublic JsonResult GetPersonInfo(){var person = new{Name = "张三" ...
- D3的基本设计思路
学习一项新技术,首先要搞清楚它的基本设计思路,有了这个宏观的技术架构,使用该技术起来,就会得心应手了.否则,就会不知道如何下手,即使看到人家的例子程序,可能也不知其所以然. 下面,就简单的结合自己研究 ...
- input输入框文字提示IE兼容
<script src="assets/js/jquery-1.9.1.min.js"></script> <script> /* * jQue ...
- [译]How to Install Node.js on Ubuntu 14.04 如何在ubuntu14.04上安装node.js
原文链接为 http://www.hostingadvice.com/how-to/install-nodejs-ubuntu-14-04/ 由作者Jacob Nicholson 发表于October ...
- flash builder (fb) 与flash professional cs6(fla) 联合调试
注意加载的swf名字与项目(fla)名字一致,在fb进行构建,如果fla代码做了修改,保持在fb构建最新.
- easyUI+mvc权限管理后台
通过按钮和菜单,组合成基本的功能,菜单的功能可以编码修改,但浏览功能是菜单基本的入口,只有角色赋予了浏览功能,才能访问. 基本按钮表 菜单模块 菜单分配按钮 角色授权 下面是对一张表的基本操作 模型 ...
- VS中的活动debug和活动cpu
“活动”的含义就是当前项目所用的模式和平台.项目中的”活动“继承于解决方案中的配置.
- mysql-5.7.16 解压版安装
下载压缩包后,解压到任盘 配置环境变量: 将“C:\MySQL;”加入到环境变量Path中 重命名my-default.ini为my.ini 修改my.ini内容: basedir =C:\MySQL ...