摘要

这一篇文章介绍在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查询(附程序下载)的更多相关文章

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

    摘要 NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系.比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产 ...

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

    摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...

  3. NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)

    摘要 NHibernate在很早的版本就提供了SQL Query(原生SQL查询),对于很复杂的查询,如果使用其他的查询方式实现比较困难的时候,一般使用SQL Query.使用SQL Query是基于 ...

  4. NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)

    摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...

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

    摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...

  6. NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)

    摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...

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

    摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...

  8. NHibernate系列文章二:创建NHibernate工程

    摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...

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

    摘要 NHibernate的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...

随机推荐

  1. 【亚瑟士 ASICS 系列】

    [新配色 36-44] [亚瑟士 黑薄荷 大工厂流线 36-44] [亚瑟士 阿斯克斯 星空 水洗丹宁 36-44] [亚瑟士 阿斯克斯 经典爆 鼠尾草 36-44] [亚瑟士 ASICS Gel S ...

  2. linux 下如何抓取HTTP流量包(httpry)

    基于某些原因你需要嗅探HTTP Web流量(即HTTP请求和响应).例如,你可能会测试Web服务器的性能,或者x奥uy调试Web应用程序或RESTful服务 ,又或者试图解决PAC(代理自动配置)问题 ...

  3. Ajax - ASP.NET MVC 4 系列

           ASP.NET MVC 框架中包含一组 Ajax 辅助方法,可以用来创建表单和指向控制器操作的链接,它们是异步的,且不用编写任何脚本代码来实现程序的异步性,但需要引入脚本文件 jquer ...

  4. Android学习十二:跑马灯程序实现(简单联系)

    package org.tonny; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; ...

  5. ng-if ng-show ng-hide 的区别

    angularjs ng-if ng-show ng-hide区别 在使用anularjs开发前端页面时,常常使用ng-show.ng-hide.ng-if功能来控制页面元素的显示或隐藏,那他们之间有 ...

  6. arcgis 10.2连接Oracle

  7. python---filecmp

    ilecmp可以实现文件,目录,遍历子目录的差异对比功能. 自带filecmp模块,无需安装. 常用方法说明 filecmp提供3个操作方法,cmp(单文件对比),cmpfile(多文件对比),dir ...

  8. 使用log4net 日志输出到数据库MySQL

    使用Log4Net的输出日志到MySQL 使用步骤如下: 1. 添加引用Log4Net.dll, mysql.data.dll到工程中 note: mysql.data.dll 版本要高,最好到mys ...

  9. OAF_文件系列7_实现OAF处理Excel的JXL包介绍(概念)

    20150714 Created By BaoXinjian

  10. HDU 1698 Just a Hook(线段树 区间替换)

    Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...