使用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 ...
随机推荐
- ldap域账号登录
$host = "iflytek.com"; $user = 'yimiao@'.$host;//'用户名@域名'; $pswd = "******"; //1 ...
- Web图片编辑控件升级日志-Xproer.ImageEditor
版权所有 2009-2014 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com 产品首页:http://www.ncmem.com/webplug/image-e ...
- 解决RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large问题
使用SourceTree客户端,向远程仓库推送时:RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request ...
- sun.misc.BASE64Decoder的风险
问题描述 最近需要使用Base64上传图片,但是返现sun.misc.BASE64Decoder 为已经过期的包,此包为以前sun公司的内部包,可以下载此包,但是不利于现在Maven方式构建,可能会在 ...
- 1、Docker介绍
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器完全使用沙箱机制,相互之间不会有任何接口 ...
- Oracle Submit Request - 请求的调用方法: FND_REQUEST.SUBMIT_REQUEST
废话: 有一段时间没搞过开发了,做项目又要重新找回点开发的记忆.重新拾回一点点零碎. 跑多了产线,配置的一些参数也忘记得差不多了,长时间没动就是易遗忘,找点资料做个笔记就是时间保镖. 正题: FN ...
- 算法 - 最小m段和问题
题目分析 给定n个整数组成的序列,要求将序列分割为m段,每段子序列中的数在原序列中连续排列,求使得子段和的最大值达到最小的分割方法 解题方法 状态转移方程 State[i][j]表示前i个数据分成j段 ...
- 【MVC】输出HTML内容,不输出HTML标签
第一种方式: @Html.Raw("内容") 第二种方式 @(new HtmlString("<h1>abcd</h1>")) 第三种方 ...
- UDP实现一个简易的聊天室 (Unity&&C#完成)
效果展示(尚未完善) UDP User Data Protocol 用户数据报协议 概述 UDP是不连接的数据报模式.即传输数据之前源端和终端不建立连接.使用尽最大努力交付原则,即不保证可靠交付. 数 ...
- 虚拟机安装MAC OS X 10.9与Windows 7共享文件夹的方法
在虚拟机中安装好MAC OS X后, 把CD/DVD中的ISO映像换成 VMwareWorkstation安装目录下的/darwin.iso, 然后连接上 进入MAC 系统后, 先安装vmware t ...