[项目过程中所遇到的各种问题记录]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表达式,可以很方便的写出所需的查询,相比上一种查询封装更加简洁,更加优雅。
话说,各位看过的朋友如果觉得本文对您还有点用,或者觉得本文还有价值的话,麻烦将鼠标移到【推荐】上,帮我点击下,非常非常的感谢!
项目过程中所遇到的各种问题记录
编辑器篇:
图表篇:
ORM篇:
部署篇:
工具篇:
出处:http://kyo-yo.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述