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<Customer>().ToList();
4         }
  • 要在代码中添加对NHibernate.Linq的引用
  • IQueryable对象是延迟加载的
  • ToList方法表示立即执行,得到IList<Customer>集合

2、创建别名

1         public IList<Customer> QueryAllLinq()
2         {
3             return (from c in Session.Query<Customer>().ToList() select c).ToList();
4         }

3、指定对象返回数组

1         public IList<int> SelectIdLinq()
2         {
3             var query = Session.Query<Customer>().Select(c => c.Id).Distinct().ToList();
4             return query.ToList();
5         }

Distinct方法返回无重复项目的序列。

4、添加查询条件

 1         public IList<Customer> GetCustomerByNameLinq(string firstName, string lastName)
 2         {
 3             return Session.Query<Customer>().Where(c => c.FirstName == firstName && c.LastName == lastName).ToList();
 4         }
 5
 6         public IList<Customer> GetCustomersStartWithLinq()
 7         {
 8             var query = from c in Session.Query<Customer>() where c.FirstName.StartsWith("J") select c;
 9             return query.ToList();
10         }

5、order by

1         public IList<Customer> GetCustomersOrderByLinq()
2         {
3             var query = from c in Session.Query<Customer>() orderby c.FirstName ascending select c;
4             return query.ToList();
5         }

6、关联查询

 1         public IList<OrderCount> SelectOrderCountLinq()
 2         {
 3             var query = Session.Query<Customer>().Select(g => new OrderCount { CustomerId = g.Id, Count = g.Orders.Count() });
 4             return query.ToList();
 5         }
 6
 7         public IList<Customer> GetCustomersOrderCountGreaterThanLinq()
 8         {
 9             var query = Session.Query<Customer>().Where(c => c.Orders.Count > 2);
10             return query.ToList();
11         }
12
13         public IList<Customer> GetCustomersOrderDateGreatThanLinq(DateTime orderDate)
14         {
15             var query = Session.Query<Customer>().Where(c => c.Orders.Any(o => o.Ordered > orderDate));
16             return query.ToList();
17         }

因为.net方法不能返回匿名类对象以及含有匿名类对象的对象,因此添加OrderCount类,SelectOrderCountLinq方法返回IList<OrderCount>对象。

1     public class OrderCount
2     {
3         public int CustomerId { get; set; }
4         public int Count { get; set; }
5     }

结语

Linq to NHibernate基于.net Linq,非常灵活。.net Linq提供的所有集合操作,Linq to NHibernate也都提供了。使用它可以完成大部分NHibernate查询。下一篇文章介绍NHibernate 3.2的Query Over查询。

时间: 2024-10-09 06:43:34

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

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

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

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 Sess

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

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树.有了这些基础我们就能更好的理解后缀树了. 一 引言 模式匹配问题 给定一个文本text[0-n-1], 和一个模式串 pattern[0-m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m). 这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处

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

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

算法系列之二十四:离散傅立叶变换之音频播放与均衡器

导语 在算法系列的第二十二篇,我们介绍了离散傅立叶变换算法的实现,将时域的音频信号转换到频域进行分析,获取拨号音频的频率特征.这一篇我们将介绍一种频域均衡器的实现方法,所谓的频域均衡器,就是在频域信号的基础上对音频数据进行调整,然后再将频域信号转换成时域信号在回放设备上播放,从而达到音色调节的目的.将频域信号转换成时域信号的算法,就是离散傅立叶逆变换算法. 1 离散傅立叶逆变换 有从时域转换到频域的方法,就必然有从频域转换到时域的方法,相对于离散傅里叶变换,这个反向转换就是离散傅里叶逆变换(ID

Hadoop运维记录系列(二十四)

从这篇开始记录一下集群迁移的事情 早先因为机房没地方,就已经开始规划集群搬机房的事情,最近终于开始动手了,我会把这次不停机迁移的过程遇到的主要问题和矛盾以及各种解决方法记录下来. 集群规模说大不大,几百台,总容量30PB左右.Hadoop使用CDH 5.5.1加一些自定义patch的rpm打包编译版本. 总的方案是集群不停机,在两个机房之间架设专线,旧机房decommission,拉到新机房recommission.每天不能下线太多机器,要保证计算. 新机房提前架设90台机器,测试带宽.带宽的测

Powershell管理系列(二十四)PowerShell操作之批量启用Exchange用户头像

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 由于组织机构比较大,分支机构的员工可能都不能相互认识,可以在GAL中除了显示联系人信息还可以显示他的照片.在Exchange server 2013里面导入图片有两种方式,一种是使用Import-RecipientDataProperty,但是对图片大小有限制,图片必须是 JPEG 格式的文件,且不得大于 10 KB:第二种是使用