NHibernate 数据查询之QueryOver<T>

 

  一、限制运算符

Where:筛选序列中的项目
WhereNot:反筛选序列中的项目

  二、投影运算符

Select:创建部分序列的投影
SelectMany:创建部分序列的一对多投影

三、分区运算符(分页常用到)

Skip:返回跳过指定数目项目的序列
SkipWhile:返回跳过不满足表达式项目的序列
Take:返回具有指定数目项目的序列
TakeWhile:返回具有满足表达式项目的序列

四、排序运算符

OrderBy:以升序按值排列序列
OrderByDescending:以降序按值排列序列
ThenBy:升序排列已排序的序列
ThenByDescending:降序排列已排序的序列
Reverse:颠倒序列中项目的顺序(用于操作集合)

五、分组运算符

GroupBy:按指定分组方法对序列中的项目进行分组

六、设置运算符

Distinct:返回无重复项目的序列
Except:返回代表两个序列差集的序列(用于操作集合)
Intersect:返回代表两个序列交集的序列(用于操作集合)
Union:返回代表两个序列交集的序列(用于操作集合)

七、转换运算符

Cast:将序列中的元素转换成指定类型
OfType:筛选序列中指定类型的元素
ToArray:从序列返回一个数组
ToDictionary:从序列返回一个字典
ToList:从序列返回一个列表
ToLookup:从序列返回一个查询
ToSequence:返回一个IEnumerable序列

八、元素运算符

DefaultIfEmpty:为空序列创建默认元素(用于操作集合)
ElementAt:返回序列中指定索引的元素(用于操作集合)
ElementAtOrDefault:返回序列中指定索引的元素,或者如果索引超出范围,则返回默认值(用于操作集合)
First:返回序列中的第一个元素
FirstOrDefault:返回序列中的第一个元素,或者如果未找到元素,则返回默认值
Last:返回序列中的最后一个元素(用于操作集合)
LastOrDefault:返回序列中的最后一个元素,或者如果未找到元素,则返回默认值(用于操作集合)
Single:返回序列中的单个元素
SingleOrDefault:返回序列中的单个元素,或者如果未找到元素,则返回默认值

九、生成运算符

Empty:生成一个空序列
Range:生成一个指定范围的序列
Repeat:通过将某个项目重复指定次数来生成一个序列

十、限定符

All:确定序列中的所有项目是否满足某个条件
Any:确定序列中是否有任何项目满足条件
Contains:确定序列是否包含指定项目

十一、聚合运算符

Aggregate:对序列执行一个自定义方法
Average:计算数值序列的平均值
Count:返回序列中的项目数(整数)
LongCount:返回序列中的项目数(长型)
Min:查找数字序列中的最小数
Max:查找数字序列中的最大数
Sum:汇总序列中的数字

十二、连接运算符

Concat:将两个序列连成一个序列

十三、联接运算符

GroupJoin:通过归组将两个序列联接在一起
Join:将两个序列从内部联接起来

  我新建了一个张表,并添加了十几条数据。

  在NHibernate中,linq查询通过session.QueryOver<T>()创建。我们先来看看NHibernate本身自带的Linq提供的操作符。

  1、And

public IList<Person_Model> Select()
{
  IList<Person_Model> list = session.QueryOver<Person_Model>().And(m => m.State).List();  //查询所有state字段为True的记录
  NHibernateHelper.CloseSession();  
  return list;
}

    以上生成的SQL语句为

exec sp_executesql N'SELECT this_.Id as Id1_0_, this_.name as name1_0_, this_.age as age1_0_, this_.state as state1_0_ FROM Person this_ WHERE this_.state = @p0',N'@p0 bit',@p0=1

  可以看到And实际上相当于一条Where语句了。条件为True的返回。

  我们把And换成Where再来看看生成的SQL语句。

exec sp_executesql N'SELECT this_.Id as Id1_0_, this_.name as name1_0_, this_.age as age1_0_, this_.state as state1_0_ FROM Person this_ WHERE this_.state = @p0',N'@p0 bit',@p0=1

  呵呵,没有区别。留待

  2、AndNot

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().AndNot(m => m.State).List();  //查询所有state字段等于false的记录
NHibernateHelper.CloseSession();
return list;
}

  我们来看看生成的SQL语句

exec sp_executesql N'SELECT this_.Id as Id1_0_, this_.name as name1_0_, this_.age as age1_0_, this_.state as state1_0_ FROM Person this_ WHERE not (this_.state = @p0)',N'@p0 bit',@p0=1

  留意到它只比And操作符的区别在于在where条件后加了个not()

  3、AndRestrictionOn

  AndRestrictionOn的中文意思是,添加限制条件。

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().AndRestrictionOn(m => m.Name).IsLike("诸",NHibernate.Criterion.MatchMode.Anywhere).List();
NHibernateHelper.CloseSession();
return list;
}

  第二个参数IsLike的第二个参数NHibernate.Criterion.MatchMode.Anywhere是一个枚举,指示百分号应该添加到哪里?

  生成的SQL语句如下:

exec sp_executesql N'SELECT this_.Id as Id1_0_, this_.name as name1_0_, this_.age as age1_0_, this_.state as state1_0_ FROM Person this_ WHERE this_.name like @p0',N'@p0 nvarchar(4000)',@p0=N'%诸%'

  4、JoinAlias

    JoinAlias主要用于连接表并添加别名,对应的SQL字句是Join,根据Person查Country

        public IList<Person_Model> Select()
{
Country_Model country = null; //必须定义一个用于别名的Country_Model,且必须为null
IList<Person_Model> list = session.QueryOver<Person_Model>().JoinAlias(m => m.Country, () => country).List();
NHibernateHelper.CloseSession();
return list;
}

    生成的sql语句为

SELECT this_.Id as Id0_1_, this_.name as name0_1_, this_.age as age0_1_, this_.state as state0_1_, this_.CountryId as CountryId0_1_, country1_.CountryId as CountryId1_0_, country1_.CountryName as CountryN2_1_0_ FROM Person this_ inner join Country country1_ on this_.CountryId=country1_.CountryId

    该查询会把Country的信息也查出来。

    其次,JoinAlias还可以支持第三个参数,其用于指定外连接的类型。

    例如将JoinAlias改为:

        public IList<Person_Model> Select()
{
Country_Model country = null; //必须定义一个用于别名的Country_Model,且必须为null
IList<Person_Model> list = session.QueryOver<Person_Model>().JoinAlias(m => m.Country, () => country,NHibernate.SqlCommand.JoinType.LeftOuterJoin).List();
NHibernateHelper.CloseSession();
return list;
}

    则,生成的SQL语句为:

SELECT this_.Id as Id0_1_, this_.name as name0_1_, this_.age as age0_1_, this_.state as state0_1_, this_.CountryId as CountryId0_1_, country1_.CountryId as CountryId1_0_, country1_.CountryName as CountryN2_1_0_ FROM Person this_ left outer join Country country1_ on this_.CountryId=country1_.CountryId

    NHibernate.SqlCommand.JoinType是一个枚举类型,其支持的值有

    枚举值            对应的SQL

    FullJoin            full outer join

    InnerJoin           inner join

    LeftOuterJoin         left outer join

    RightOuterJoin         right outer join

    None              不连接,不连接还要这个参数干嘛?

    5、JoinQueryOver

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().OrderBy(p => p.Age).Desc.Inner.JoinQueryOver<Country_Model>(o => o.Country).List();
NHibernateHelper.CloseSession();
return list;
}

    生成的SQL语句为

SELECT this_.Id as Id0_1_, this_.name as name0_1_, this_.age as age0_1_, this_.state as state0_1_, this_.CountryId as CountryId0_1_, country_mo1_.CountryId as CountryId1_0_, country_mo1_.CountryName as CountryN2_1_0_ FROM Person this_ inner join Country country_mo1_ on this_.CountryId=country_mo1_.CountryId ORDER BY this_.age desc

    还不知道与JoinAlias有什么区别,除了返回值类型,唉。这个东西好他妈的难。

    6、OrderBy

    Order主要用于排序,相当于SQL语句里面的order by。

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().OrderBy(p => p.Age).Desc.List(); //按照年龄降序排序
NHibernateHelper.CloseSession();
return list;
}

    生成的SQL语句为

SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_ ORDER BY this_.age desc

    其中OrderBy方法后面能跟的属性有两个,分别是Asc与Desc与数据库的SQL语句对应相同意思。

    7、OrderByAlias

    8、Lock

     9、Select

    告知NHibernate你想要查询的是什么东西。

            IList<int> list1 = session.QueryOver<Person_Model>().Select(p => p.Age).List<int>();  //获取所有年龄的IList集合
NHibernateHelper.CloseSession();
return list;

    生成的SQL语句为

        SELECT this_.age as y0_ FROM Person this_

    10、ThenBy

    与SQL语句中的then by同义。

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().OrderBy(p => p.Age).Asc.ThenBy(p => p.Id).Desc.List();
NHibernateHelper.CloseSession();
return list;
}

     生成的SQL语句为

  SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_ ORDER BY this_.age asc, this_.Id desc

    11、Where

      添加where条件,与SQL语句同义。

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().Where(p => p.Age > 50).List();
NHibernateHelper.CloseSession();
return list;
}

      生成的SQL语句为

exec sp_executesql N'SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_ WHERE this_.age > @p0',N'@p0 int',@p0=50

    12、WhereNot

      添加where条件,只是前面加了个Not。

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().WhereNot(p => p.Age > 50).List();
NHibernateHelper.CloseSession();
return list;
}

      生成的SQL语句为

exec sp_executesql N'SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_ WHERE not (this_.age > @p0)',N'@p0 int',@p0=50

    13、Skip

      跳过指定数量的记录

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().Skip(5).List();
NHibernateHelper.CloseSession();
return list;
}

      生成的SQL语句为

exec sp_executesql N'SELECT TOP (2147483647) Id0_0_, name0_0_, age0_0_, state0_0_, CountryId0_0_ FROM (SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Person this_) as query WHERE query.__hibernate_sort_row > @p0 ORDER BY query.__hibernate_sort_row',N'@p0 int',@p0=5

    14、Take

      获取指定数量的记录,与Skip配合使用是经常用到的分页效果。

        public IList<Person_Model> Select()
{
IList<Person_Model> list = session.QueryOver<Person_Model>().Take(5).List();
NHibernateHelper.CloseSession();
return list;
}

      生成的SQL语句为

exec sp_executesql N'SELECT TOP (@p0)  this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_',N'@p0 int',@p0=5

    15、RowCount()

      统计符合条件的记录,相当于Select Count(*) from...

            int count = session.QueryOver<Person_Model>().RowCount();
NHibernateHelper.CloseSession();

      生成的SQL语句为

    SELECT count(*) as y0_ FROM Person this_

    16、RowCountInt64

      也是统计记录,与RowCount没什么区别,只是返回的记录是long类型的。

            long count = session.QueryOver<Person_Model>().RowCountInt64();
NHibernateHelper.CloseSession();

       生成的SQL语句为

  SELECT count(*) as y0_ FROM Person this_

    17、SingleOrDefault

       返回符合条件的第一条记录,当为空是,返回一个各属性为null的对应类型的对象。

            Person_Model p = session.QueryOver<Person_Model>().Where(m => m.Age == 10).SingleOrDefault();
NHibernateHelper.CloseSession();

      生成的SQL语句为

exec sp_executesql N'SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_ WHERE this_.age = @p0',N'@p0 int',@p0=10

    18、Future

      Future()与List()的区别在于Future返回的是IEnumerable<>集合,而List()返回的是IList()。

            IEnumerable<Person_Model> list1 = session.QueryOver<Person_Model>().Where(m => m.Age > 10).Future();
NHibernateHelper.CloseSession();

      与SQL语句无关

    19、List

      List()将结果集合封装为IList()接口集合返回。

            IList<Person_Model> list = session.QueryOver<Person_Model>().WhereRestrictionOn(p => p.Age).IsIn(ints).List();
NHibernateHelper.CloseSession();

      与SQL语句无关。

    20、FutureValue()

            IFutureValue<Person_Model> list1 = session.QueryOver<Person_Model>().WhereRestrictionOn(p => p.Age).IsIn(ints).FutureValue();
Person_Model p1 = list1.Value;

      FutureValue()这是一个非常简单的接口,里面就一个泛型的Value属性,也就是说.FutureValue()这个东西只是装载了一个对应查询类型的对象而已。

      与SQL语句无关。

    21、WhereRestrictionOn

      这个东西与前面说的AdnRestrictionOn是一样的,也是可以添加条件啥乱七八糟的。

            IEnumerable<Person_Model> list1 = session.QueryOver<Person_Model>().WhereRestrictionOn(p => p.Age).IsIn(ints).Future();
NHibernateHelper.CloseSession();

      生成的SQL代码为:

exec sp_executesql N'SELECT this_.Id as Id0_0_, this_.name as name0_0_, this_.age as age0_0_, this_.state as state0_0_, this_.CountryId as CountryId0_0_ FROM Person this_ WHERE this_.age in (@p0, @p1, @p2)',N'@p0 int,@p1 int,@p2 int',@p0=20,@p1=25,@p2=31
 
 
标签: NHibernate

QueryOver<T>的更多相关文章

  1. NHibernate 数据查询之QueryOver<T>

    NHibernate 数据查询之QueryOver<T>   一.限制运算符 Where:筛选序列中的项目WhereNot:反筛选序列中的项目 二.投影运算符 Select:创建部分序列的 ...

  2. NHibernte 4.0.3版本中,使用Queryover().Where().OrderBy().Skip().Take()方法分页获取数据失败

    问题代码如下: var result=repository.QueryOver<modal>() .Where(p=>p.Code==Code) .OrderBy(p=>p.I ...

  3. MVC Nhibernate 示例

    首先,非常感谢提出问题的朋友们,使得本人又去深入研究了NHibernate的<Session-Per-Request 模式>.   前言: 谈到NHibernate大伙并不陌生,搞Java ...

  4. 学习总结之 WebApi 用户登录和匿名登录,及权限验证

    近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多.感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!! WebApi登陆与身份 ...

  5. 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能

    下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...

  6. 一次Oracle 11g+FluentNHibernate AutoMapping组合尝试

    本文的上下文环境 操作系统:Win7 x64 Ultimate开发工具:Visual Studio 2013 一.前言 在以前开发的大多数场景下,使用的开发语言是C#,使用的数据库是Sql Serve ...

  7. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  8. SQL Server字符串左匹配

    在SQL Server中经常会用到模糊匹配字符串的情况,最简单的办法就是使用like关键字(like语法http://msdn.microsoft.com/en-us/library/ms179859 ...

  9. 用nhibernate的几点小经验

    最近几个月都在用nhibernate做项目.写几点经验. 1. 解决Transient object exception 原项目是用Entity Framework做的.现在是用nhibernate代 ...

随机推荐

  1. linux下一个apache+tomcat负载均衡和集群

    先说一下我的环境 一个ubuntu虚拟机, 一个apache2.2示例 两tomcat1.7示例 1.安装apacheserver sudo apt-get install apache2 假设要重新 ...

  2. 使用 Advanced Installer 打包 一键安装Web应用程序

    原文:使用 Advanced Installer 打包 一键安装Web应用程序 安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置应用程序名称和 ...

  3. python抓取网络内容

    最近想做研究互联网来获取数据,只是有一点python,让我们来看一个比较简单的实现. 例如,我想抓住奥巴马的每周演讲http://www.putclub.com/html/radio/VOA/pres ...

  4. Angularjs里面跨作用域

    Angularjs里面跨作用域的实战!   好久没有来写博客了,最近一直在用Google的AngularJS,后面我自己简称AngularJS就叫AJ吧! 学习AngularJS一路也是深坑颇多啊-- ...

  5. Telephone Lines USACO 月赛

    以前做过这套题目 这个题又重新写了:http://www.cnblogs.com/jh818012/archive/2013/05/05/3182681.html 还是以前的思路 一直错在一个地方:决 ...

  6. Redis源代码分析(十)--- testhelp.h小测试框架和redis-check-aof.c 日志检测

    周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下 ...

  7. validform.js使用方法

    表单验证之validform.js使用方法 一.validform有什么用? 网页上有大量的input需要你进行验证的时候,如果是弹窗的话,需要不停地判断,如果为空,弹窗.如果不是数字,弹窗. 所以要 ...

  8. 基于LINUX的多功能聊天室

    原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来 ...

  9. 十天学Linux内核之第七天---电源开和关时都发生了什么

    原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...

  10. ubuntu12.04下一个samba、tftp、nfs构造

    1.samba setting   1>apt-get install samba     apt-get install smbfs   2>mkdir /home/linux/shar ...