博客
关于我
[项目过程中所遇到的各种问题记录]ORM篇——有关NHibernate查询封装
阅读量:798 次
发布时间:2023-03-29

本文共 3771 字,大约阅读时间需要 12 分钟。

NHibernate查询封装实践总结

记录了我在配置NHibernate实体所遇到的一些问题

最近在配置NHibernate实体时遇到了不少问题,今天这篇则主要介绍的是对NHibernate的查询封装相关的问题。NHibernate到目前的3.0版本已经有了几种查询方式,比如:Get、Query、HQL、Criteria,实际使用的过程中可以根据需求选择其中一种或多种方式进行查询。在项目开发过程中,通常会对NHibernate进行一些简单的封装。

基本的增删改不说了

今天主要想说的是对查询封装的问题。前段时间一直在研究如何实现类似LINQ的效果,经过网上资料查找和尝试,找到了2种方法,现在记录一下。


一、通过Criteria进行查询

这个查询封装是我在CodePlex中无意中看到的,具体项目地址:(注:此处已去除具体链接)。这个项目是《NHibernate with ASP.net Problem-Design-Solution》一书中贯穿讲解NHibernate的,其中对于查询的封装做得很好,使用起来也很方便。原版代码是VB.NET的,我这里附上C#版本的,主要步骤如下:

  • 建立实体类CriteriaParameter用来包装查询参数

    代码如下:

    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; set; }    public object Value { get; set; }    public CriteriaOperator CriteriaOperator { get; set; }}

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

    public enum CriteriaOperator{    Like = 1,    Equals = 2}

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

  • 具体的查询封装代码

    代码如下:

    public virtual IList
    FindBy(List
    query){ using (_session = NHibernateHelper.GetCurrentSession()) { var criteria = _session.CreateCriteria
    ().SetCriteriaGroup(); 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
    ().ToList(); }}

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

    public void SelectByLikeName(string name){    var list = studentService.FindBy(new List
    () { new CriteriaParameter("Name", name, CriteriaOperator.Like) });}

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


  • 二、LINQ查询封装

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

    public virtual IList
    FindBy(Func
    expression){ using (_session = NHibernateHelper.GetCurrentSession()) { IList
    list = _session.Query
    () .Where(expression) .ToList(); return list; }}

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

    public void SelectByName(string name){   var list = studentService.FindBy((obj) => obj.Name == name);}

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


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

    在实际项目中,我也经历了许多问题和挑战。这些问题主要集中在以下几个方面:

    1. 编辑器篇

    • 问题:在配置NHibernate时,常常会遇到编辑器支持不足的问题,尤其是在手动编写HQL或Criteria时, IntelliSense 可能会显著减弱,导致代码错误率上升。
    • 解决方法:可以通过学习HQL和Criteria的语法,逐步掌握这些查询语言的特点和使用技巧,减少对编辑器的依赖。

    2. 图表篇

    • 问题:在NHibernate的关系图配置中,尤其是多对多关系时,容易出现循环依赖或冗余字段,导致数据库设计混乱。
    • 解决方法:在设计数据库 schema 时,需要仔细规划外键关系,避免冗余字段,同时合理使用合成(Composite)主键。

    3. ORM篇

    • 问题:在使用NHibernate进行 ORM 时,映射文件(Mapping)的配置可能会出现语法错误或配置错误,导致程序运行异常。
    • 解决方法:可以通过反复检查映射文件的语法,或者使用工具(如NHibernate Profiler)来辅助配置和验证。

    4. 部署篇

    • 问题:在将NHibernate应用部署到生产环境时,可能会遇到数据库连接、性能优化等问题。
    • 解决方法:需要提前在测试环境中进行充分的性能测试和数据库连接验证,确保在生产环境中能够稳定运行。

    5. 工具篇

    • 问题:在使用NHibernate时,可能会依赖一些第三方工具或插件,但这些工具可能会存在更新不及时、兼容性问题等问题。
    • 解决方法:可以通过选择稳定且被广泛支持的工具或插件,避免因工具问题而影响项目进度。

    以上就是我在实际项目中对NHibernate查询封装的探索和实践总结。通过这些实践,我逐渐掌握了NHibernate的查询封装方法,并也积累了许多在实际项目中遇到的问题和解决方法。

    转载地址:http://pqhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现判断32位的数字是否为正数isPositive算法(附完整源码)
    查看>>
    Objective-C实现十进制转N进制算法(附完整源码)
    查看>>
    Objective-C实现十进制转八进制算法(附完整源码)
    查看>>
    Objective-C实现华氏温度转摄氏温度(附完整源码)
    查看>>
    Objective-C实现单例模式(附完整源码)
    查看>>
    Objective-C实现单向链表的反转(附完整源码)
    查看>>
    Objective-C实现单向链表的反转(附完整源码)
    查看>>
    Objective-C实现单字母密码算法(附完整源码)
    查看>>
    Objective-C实现单循环链表算法(附完整源码)
    查看>>
    Objective-C实现单词计数(附完整源码)
    查看>>
    Objective-C实现单链表反转(附完整源码)
    查看>>
    Objective-C实现博福特密码算法(附完整源码)
    查看>>
    Objective-C实现卡尔曼滤波(附完整源码)
    查看>>
    Objective-C实现卡尔曼滤波(附完整源码)
    查看>>
    Objective-C实现卡尔曼滤波(附完整源码)
    查看>>
    Objective-C实现压缩文件夹(附完整源码)
    查看>>
    Objective-C实现原型模式(附完整源码)
    查看>>
    Objective-C实现双向A*算法(附完整源码)
    查看>>
    Objective-C实现双向广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现双向循环链表(附完整源码)
    查看>>