使用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 ...
随机推荐
- 看图说说Sun HotSpot虚拟机对象
- swift 自定义弹框
// // ViewController.swift // animationAlert // // Created by su on 15/12/9. // Copyright © 2015 ...
- .NET基础 (10)流和序列化
流和序列化1 什么是流,.NET中有哪些常见的流2 如何使用压缩流3 Serializable特性有何作用4 .NET提供了哪几种可进行序列化操作的类型5 如何自定义序列化和反序列化的过程 流和序列化 ...
- jmeter 计数器 (可自动生成新数字、注册专用)
1.打开jmeter,创建好线程组后,添加计数器 2.设置计数器 3.添加HTTP请求,验证所设置的计数器 4.填写对应参数 5.添加查看结果树,查看结果 6.修改一下线程属性 7.跑一下,看下结果就 ...
- POJ3281 Dining 2017-02-11 23:02 44人阅读 评论(0) 收藏
Dining Description Cows are such finicky eaters. Each cow has a preference for certain foods and dri ...
- centos mysql忘记密码找回(仅限mysql5.7)
1.停掉mysql 2.执行#mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 3.#mysql 4.updat ...
- winform在A窗体刷新B窗体,并改变窗体的属性
//A窗体设置B窗体的属性并刷新B窗体 Application.OpenForm["窗体名称"].Controls["控件名称"].visible=true;
- leetcode 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: - 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...
- 将网页发布到远程windows server
1.在vs下利用文件系统发布asp.net文件 2.将生成的所有文件打包成ZIP 3.将zip文件复制并解压到远程windows server的自己创建的文件夹下 4.在windows server上 ...
- spring的父子上下文容器及配置
本文由作者张远道授权网易云社区发布. spring父子容器 spring总的上下文容器有父子之分.父容器和子容器.父容器对子容器可见,子容器对父容器不可见. 对于传统的spring mvc来说,spr ...