使用NHibernate(5)-- Linq To NHibernate
Linq是NHibernate所支持的查询语言之一,对于Linq的实现在源码的src/Linq目录下。以下是一个使用Linq进行查询数据的示例:
var users = session.Query<User>().where(n=>n.Id=5).OrderBy(n=>n.Name).ToList();
session在我们跑起来的第一个程序的Controller中已经介绍过了,它是查询数据库的入口;通过调用其泛型方法Query,可以拿到相应的集合,然后通过where方法进行条件过滤,通过OrderBy进行排序;注意到此为止,NHibernate并没有去查询数据库,而是调用ToList的方法的时候才去访问数据库,这就是延迟查询,即用到某个数据的时候NHi才回去查询。对于延迟查询的使用和原理分析,打算后面再讨论。
Nhibernate3.3对Linq的支持已经非常好了,实现了几乎所有的Linq接口,下面是Linq to Nhibernate 所支持的方法:
聚合方法:
Count、Sum 、Min、Max、Average
转换方法:
ToArray, ToList, ToDictionary, OfType
单个查询:
First, FirstOrDefault, ElementAt
生成:
Range,Repeat
分组:
GroupBy
连接:
Cross, Group, Left Outer
排序:
OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse
分区查询:
Take,Skip,TakeWhile,SkipWhile
投影运算符:
Select ,SelectMany
限量运算:
Select ,SelectMany
条件:
Where
集合:
Distinct, Union, Intersect, Except
下面演示如何通过Linq to NHibernate进行分页查询:
var count = session.Query<User>().Count();
var users = session.Query<User>().OrderBy(n=>n.name).Skip((pageIndex-1)*pageSize).Take(pageSize).ToList();
首先对用户进行排序,然后跳过(pageIndex-1)*pageSize条数据,最后Take。
上述代码会和数据库有两次交互,第一次是查询总数即count ,第二次是查询分页数据。如果想在一次交互中执行上述两条sql,则可以用NHibernate特有的Futre查询,代码修改如下:
var count = session.Query<User>().Count().ToFuture();
var users = session.Query<User>().OrderBy(n=>n.name).Skip((pageIndex-1)*pageSize).Take(pageSize).ToFuture().ToList();
虽然数据的增删改跟Linq无关,但也打算在这里提一下,感觉这样就可以进行CRUD了。
插入数据:
User user = new User(){Name="FuzhePan"};
session.Save(user );
保存后,user的主键就已经有值了。
修改数据:
Session.Update(user);
删除数据:
Session.Delete(user);
注意:数据增删改之后,如果开启了事务,需要提交事务,数据才会被持久化到数据库中。
使用NHibernate(5)-- Linq To NHibernate的更多相关文章
- Linq To Nhibernate 性能优化(入门级)
最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net.废话不多说了,下面讲讲 ...
- Linq to NHibernate入门示例
Linq to NHibernate入门示例 NHibernate相关: 09-08-25连贯NHibernate正式发布1.0候选版 09-08-17NHibernate中一对一关联的延迟加载 09 ...
- linq to NHibernate
什么是linq to NHibernate 什么是linq to NHibernate?说简单一点就是linq + NHibernate. linq语句是.Net 3.5中新增的功能,从问世以来就 ...
- NHibernate 数据查询之Linq to NHibernate
刚学NHibernate的时候觉得,HQL挺好用的,但是终归没有与其他技术相关联,只有NHibernate用到,一来容易忘记,二来没有智能提示,排除错误什么的都不给力,直到看到一个同事用Linq to ...
- NHibernate Session-per-request and MiniProfiler.NHibernate
NHibernate Session-per-request and MiniProfiler.NHibernate 前言 1.本文以mvc3为例,借鉴开源项目 NerdDnner项目完成nhiber ...
- JQGrid+Nhibernate+Webservice+Linq
先上效果图: 前台代码(jqgridtest.aspx): <%@ Page Language="C#" AutoEventWireup="true" ...
- [NHibernate]利用LINQPad查看NHibernate生成SQL语句
上篇文章中我们提到可以通过重写NHibernate的 EmptyInterceptor 拦截器来监控NHibernate发送给数据库的SQL脚本,今天看到有朋友用LINQPad工具来进行NHibern ...
- NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)
摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...
- NHibernate Linq查询 扩展增强 (第九篇)
在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver<TRoot, TSubType>接口提供的.IQu ...
随机推荐
- Mysal表类型的区别-MyISAM,InnoDB
1/ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源.I ...
- msfvenom木马生成+免杀+壳(实测并不能免杀)
msfvenom 选项: -p, --payload 有效载荷使用.指定一个有效的自定义载荷 --payload-options 列出有效载荷的标准选项 -l, --list [type] 列出一个模 ...
- cron.c
/* $OpenBSD: cron.c,v 1.39 2007/02/18 23:59:03 jmc Exp $ */ /* Copyright 1988,1990,1993,1994 by Paul ...
- 第二届CCCC赛后感想 2017-04-15 23:56 88人阅读 评论(0) 收藏
第一次写赛后感想,也不算什么很正规的比赛,不过这次比赛的时间恰好处于思想变化的阶段,留贴纪念. 先谈谈这次比赛,弱校萌新,依靠申请进了总决赛,发现和第一届不一样,缺少了团队奖心中有点缺乏动力,比赛2个 ...
- Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用
一.gitHub地址及介绍 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh android-Ultra-Pull-To-Refre ...
- 国际时区 TimeZone ID列表
public static void main(String[] args) { Calendar c = new GregorianCalendar(); c.setTime(new Date()) ...
- Mysql部署
1. 下载 Mysql 版本为: mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz (注意:下载二进制文件)  存放位置: /usr/local 2. 检查机器上 ...
- UDP实现一个简易的聊天室 (Unity&&C#完成)
效果展示(尚未完善) UDP User Data Protocol 用户数据报协议 概述 UDP是不连接的数据报模式.即传输数据之前源端和终端不建立连接.使用尽最大努力交付原则,即不保证可靠交付. 数 ...
- 安卓 往SD卡里写文件不能及时更新的问题
我们做Android开发时奖保存图片到SD卡,但是Gallery中不能及时显示 下面我找到了问题所在然后解决了这个问题. 当保存图片后打开gallery时,有的会自动给你刷新,有的不行,这样就导致图片 ...
- BZOJ1558 等差数列
题目链接:戳我 实话实话,看了几篇题解真的没看懂,我觉得讲的都有问题.这里对于线段树维护的s写了一点我自己的理解. 看到等差数列,我们考虑对数列做差,这样如果是等差数列,那么值应该相等.(比较容易维护 ...