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的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...
随机推荐
- Python 常用函数
字符串->数字: float(str) int(str) 十六进制字符串转int: 不带0x前缀: x = int('dead',16) 带0x前缀: x = int('0xff', 0) 其中 ...
- Centos 6.5安装oracle 11g
(添加host)一.Centos 6.5 安装图形界面 gnome # yum groupinstall "Desktop" # yum groupinstall "X ...
- ABBYY FineReader 12对系统有哪些要求
ABBYY FineReader是市场领先的ocr文字识别软件,可快速方便地将扫描的文档.PDF文档和图像文件(包括数码照片)转化为可编辑.可搜索的格式.每个软件都有其安装运行的系统要求,ABBYY ...
- 如何在IDEA 中使用Git
1,下载最新的 git 包 地址: https://git-scm.com/download/win 下载便携版 64,32 根据个人爱好 2,解压后随便放个位置即可,例如图: (不太建议使用它自 ...
- BackgroundWorker学习
后台代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...
- CocoaPods本身版本的更新
sudo gem update --system sudo gem install cocoapods pod setup pod --version sudo gem install cocoapo ...
- Keep-Alive 总结
一.简介 Keep-Alive是http请求头信息中的一个配置参数,开启之后俗称保持HTTP长连接,HTTP 1.0和HTTP 1.1都支持,HTTP1.0中该属性默认是关闭的,可在头信息中配置开启( ...
- Ubuntu 13.10看视频休眠
cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla[ ...
- 转:面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”
转自:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/ 面试题目: 地球人都知道,Java有个东西叫垃圾收集 ...
- Calendar
/* * Calendar:它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方 ...