[项目过程中所遇到的各种问题记录]ORM篇——有关NHibernate查询封装

简介:

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

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

      pic103

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

我想要的查询封装其实很简单,就是可以可以通过表达式进行数据查询,类似于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表达式,可以很方便的写出所需的查询,相比上一种查询封装更加简洁,更加优雅。

 

话说,各位看过的朋友如果觉得本文对您还有点用,或者觉得本文还有价值的话,麻烦将鼠标移到【推荐】上,帮我点击下,非常非常的感谢!

 

项目过程中所遇到的各种问题记录

编辑器篇:

        FCKeditor相关知识及各种常见使用问题

        FCKeditor自定义上传路径配置

        使用FCKeditor生成静态分页HTML

图表篇:

        有关MSChart的一些小技巧

        asp.net上不错的图表选择—FunsionCharts

ORM篇:

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

        有关NHibernate查询封装

部署篇:

        项目部署过程中那些纠结的问题-IIS

        项目部署过程中那些纠结的问题-SQLServer

工具篇:

        .NET开发时常用的工具类库



本文转自kyo-yo博客园博客,原文链接:http://www.cnblogs.com/kyo-yo/archive/2010/12/23/Problem-Record-ORM-Some-NHibernate-Query-About-Package.html,如需转载请自行联系原作者


目录
相关文章
|
存储 SQL 前端开发
前端也该知道,除了 select 、 from 、 where 之外的另外几个重要的数据库操作
由于自己的数据库知识还停留在大学时期,对仅存的 select 、 from 、 where 这几个关键字的印象,稍微复杂一点的操作就又要一直检索查。。。
|
SQL Java 数据库连接
hibernate自定义sql关联查询结果组装为对象
hibernate自定义sql关联查询后没有对应的entity,如何映射为对应的bean
263 0
|
数据库连接 数据库
ORM映射框架总结--数据操作(五)
1.数据库加载驱动和操作接口 IDbProvider 代码  1 /** 2  *  3  * 2009-4-22 4  *  5  *  6  * 数据库操作加载驱动接口,  7  * 提供了数据库操作的各种命令  8  * */ 9 using System;10 using System.
803 0
|
存储 SQL 数据库
ORM映射框架总结--数据操作(七)
2. 数据库操作实现类 SqlHelper 代码 /** *  * 2009-4-22 *  *  * 数据库操作的公共类 * */using System;using System.Collections.
705 0
|
SQL 存储 数据库
ORM映射框架总结--数据操作(六)
1. 数据库操作接口 IDbHelper 代码 /** *  * 2009-4-22 *  *  * 提供各种数据库操作方法以及实体类操作方法 * */using System;using System.
656 0
|
SQL
ORM映射框架总结--数据操作(四)
1.BaseEntityHelper 解析实体类特性 代码   1 /**  2  *   3  * 2009-4-17  4  *   5  *   6  * 字段的特性  7  * */  8 using System;  9 using System.
793 0
|
SQL 存储 .NET
ORM映射框架总结--数据库操作库(精修版)
1.       ORM数据库操作原理 前面已经介绍过了个人ORM映射框架中的三个核心库: 实体—数据库 映射特性关系: http://www.cnblogs.com/qingyuan/archive/2010/04/02/1702998.
1406 0
|
数据库
Git.Framework 框架随手记--ORM查询返回实体对象
  使用ORM有一个优势,可以通过某种机制将数据库中的数据转化为自己想要的对象形式数据。本章记录一下如何使用Git.Framework返回实体对象     一. Git.Framework 中提供的方法     在Git.
1028 0
|
Web App开发 数据库 容器
EntityFramework中常用的数据删除方式速度对比
EntityFramework中常用的数据删除方式速度对比http://www.bieryun.com/3375.html 最近在学EF,目前了解到删除操作有三种方式, 第一,官方推荐的先查询数据,再根据查询的对象,删除对象。
1425 0