ORM篇——有关NHibernate查询封装

前篇文章记录了我在配置NHibernate实体所遇到的一些问题,今天这篇则主要介绍的是对NHibernate的查询封装相关的问题。

NHibernate到目前的3.0版本已经有了几种查询方式,比如:Get、Query、HQL、Criteria,实际使用的过程中可以根据需求选择其中1种或多种方式进行查询,对于许多项目开发过程中总会对项目进行一些抽象封装,采用NHibernate进行开发的话,大部分应该都会对Nhibernate进行一些简单的封装,如下图:

基本的增删改我就不说了,今天主要想说的是对查询封装,也是我前段时间一直纠结的问题。

我想要的查询封装其实很简单,就是可以可以通过表达式进行数据查询,类似于LINQ的效果,后来网上找了点资料,加上自己试验了下找到了2个方法,现在记录一下:

一、通过Criteria进行查询

这个查询封装是我在CodePlex中无意中看到的,具体的项目地址:点我进入,这个项目是《NHibernate with ASP.net Problem-Design-Solution》一书中贯穿讲解NHibernate的,其中对于查询的封装做的很好,而且使用起来也很方便,原版代码是VB.NET的,我这边附上C#版本的,主要步骤如下:

1、建立实体类CriteriaParameter用来包装作为参数传递的表达式,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

public class CriteriaParameter

{

    private string _property;

    private object _value;

    private CriteriaOperator _operator;

    public CriteriaParameter(string propertyName, object value, CriteriaOperator @operator)

    {

        _property = propertyName;

        _value = value;

        _operator = @operator;

    }

    public string PropertyName

    {

        get { return _property; }

        set { _property = value; }

    }

    public object Value

    {

        get { return _value; }

        set { _value = value; }

    }

    public CriteriaOperator CriteriaOperator

    {

        get { return _operator; }

        set { _operator = value; }

    }

}

这个类主要有3个属性:PropertyName-属性名称,Value-属性值以及CriteriaOperator-操作符号枚举,具体枚举代码如下:


1

2

3

4

5

6

public enum CriteriaOperator

{

    Like = 1,

    Equals = 2

}

这个枚举目前仅有2个,like和equals,实际运用的过程中可以根据需求自己添加相应的操作符号,比如Gt(大于),Lt(小与)等等。

接下来是具体的查询封装代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public virtual IList<T> FindBy(List<CriteriaParameter> query)

{

    using (_session = NHibernateHelper.GetCurrentSession())

    {

        var criteria = _session.CreateCriteria<T>();

        //遍历查询条件,根据操作符号添加相应的表达式

        foreach (var item in query)

        {

            switch (item.CriteriaOperator)

            {

                case CriteriaOperator.Equals:

                    criteria.Add(NHibernate.Criterion.Expression.Eq(item.PropertyName, item.Value));

                    break;

                case CriteriaOperator.Like:

                    criteria.Add(NHibernate.Criterion.Expression.Like(item.PropertyName,

                        String.Format("{0}%", item.Value)));

                    break;

                default:

                    break;

            }

        }

        return criteria.List<T>();

    }

}

这个方法主要接收1个参数,类型为CriteriaParameter的泛型列表,其内部主要是根据具体的操作符号然后拼接相应的表达式,调用代码如下:


1

2

3

4

5

6

public void SelectByLikeName(string name)

{

    var list = studentService.FindBy(new List<Common.CriteriaParameter>() {

        new Common.CriteriaParameter("Name", name, Common.CriteriaOperator.Like)

    });

}

总的来说还是很方便的,只需创建个列表,然后再创建CriteriaParameter类并将其添加到列表中就可以了,不过相比3.0的LINQ来说这种封装要逊色不少,这种适合3.0以下的查询。

二、LINQ查询封装

Nhibernate在3.0正式开始支持LINQ了,提供了独立LINQ Provider,为我们开发者做查询节省了很大的功夫,我们实际的查询封装只需以下几行代码既可:


1

2

3

4

5

6

7

8

public virtual IList<T> FindBy(Func<T, bool> expression)

{

    using (_session = NHibernateHelper.GetCurrentSession())

    {

        IList<T> list = _session.Query<T>().Where(expression).ToList();

        return list;

    }

}

将Func<T, bool>作为参数传入where方法中即可,调用代码如下:


1

2

3

4

public void SelectByName(string name)

{

    var list = studentService.FindBy((obj) => obj.Name == name);

}

使用起来相当的方便,利用lambda表达式,可以很方便的写出所需的查询,相比上一种查询封装更加简洁,更加优雅。

时间: 2024-10-09 19:47:06

ORM篇——有关NHibernate查询封装的相关文章

ORM篇——使用NHibernate配置对象实体的一些小问题

问题记录,前段时间公司有新的项目所以我想在新的项目里使用NHibernate这类ORM框架来代替原有的代码生成的拼SQL,不过可惜的是最终使用NHibernate还是没成功,最终还是继续使用已有的代码生成方式. NHibernate在去年的这个时候也研究过,可后来也搁浅了,今年的这个时候研究了结果有搁浅了,不知道是不是犯冲?不过还是把遇到的问题记录下来吧,以备后患. 配置实体的一些小问题 下面就开始记录下我碰到的问题吧,其实都是自己没看资料而导致的问题,稍微熟悉NHibernate的朋友都应该知

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

ORM利器:NHibernate(一)简介

简介: ORM(Object Relational Mapping)对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 . 为什么出现ORM?     面向对象的特征:我们通常使用的开发语言Java,.Net都是面向对象的.面向封装了对象,对象内部有属性和方法.     关系型数据库的特点:以表的形式组织我们的数据.以列的形式表述了表的特征.表中的一条记录=一个对象,表中的列代表了对象中的属性.表之间是建立了一定的联系.     如何表中的一条记录提取出来封装成一个对象?

ORM利器:NHibernate(三)五部曲+简单对象CRUD+HQL

前面的两篇文章中,我们对NHibernate已经做了大致了解 <ORM利器:NHibernate(一)简介>Nhibernate的作用:解决了对象和数据库的转化问题 <ORM利器:NHibernate(二)使用CodeSmith快速生成映射文件和映射类>利用CodeSmith由表导出映射类(就是通常所说的Entity)和映射文件(告诉你表和对象之间是如何建立一一对应的关系的). 接下来将会对NHibernate的使用做Demo解析,分为五部曲: 创建表.若要把对象转换为数据库中的表

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查询之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<C

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特有的面向对象查询语言,他具有继承.多态的

ORM的多表查询详述

ORM的多表查询 ORM最核心与用的最多的地方就是跨表查询了.这里的"跨表查询"大分为以下几种:基于对象的跨表查询.基于双下划线的跨表查询.聚合查询.F与Q查询以及分组查询. 下面就为大家详细阐述这几种查询的具体细节及用法. 另外,本文省去了Django与MySQL数据库之间建立连接以及创建表.添加表记录的过程.如果大家有兴趣可以回顾下我之前的两篇文章: https://www.cnblogs.com/paulwhw/p/9395085.html https://www.cnblogs

SQL Server调优系列基础篇(子查询运算总结)

原文:SQL Server调优系列基础篇(子查询运算总结) 前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴趣的童鞋可以点击查看. 本篇我们介绍关于子查询语句的一系列内容,子查询一般是我们形成复杂查询的一些基础性操作,所以关于子查询的应用方式就非常重要. 废话少说,开始本篇的正题. 技术准备 数据库版本为SQL Server2008R2,利用微软