NHibernate 是一个强大的 ORM 框架,本博文主要就 NHibernate 的使用方法及语法做一些简单的介绍。
 
 1.NHibernate 语法
 
  新建一个类,命名为: QueryCriteriaAPI, 并创建构造函数

        private ISession _session;
public ISession Session
{
set
{
_session = value;
}
}
public QueryCriteriaAPI(ISession session)
{
_session = session;
}
    #region 语法学习
/// <summary>
/// 创建ICriteria实例
/// </summary>
/// <returns></returns>
public IList<Customer> CreateCriteria()
{
//NHibernate.ICriteria这个接口代表对一个特定的持久化类的查询。
//ISession是用来制造Criteria实例的工厂。
var crit = _session.CreateCriteria(typeof(Customer));
crit.SetMaxResults(50);
var customers = crit.List<Customer>();
return customers;
}
/// <summary>
/// 缩小结果集范围
/// </summary>
/// <returns></returns>
public IList<Customer> Narrowing()
{
//一个查询条件(Criterion)是NHibernate.ICriterion接口的一个实例。
//类NHibernate.Expression.Expression定义了获得一些内置的ICriterion类型的工厂方法。 var customers = _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Like("Firstname", "YJing%"))
.Add(Restrictions.Between("Lastname", "A%", "Y%"))
.List<Customer>(); //表达式(Expressions)可以按照逻辑分组
//IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
// .Add(Restrictions.Like("Firstname", "YJ%"))
// .Add(Restrictions.Or(
// Restrictions.Eq("Lastname", "L%"),
// Restrictions.IsNull("Lastname")
// ))
// .List<Customer>(); //IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
// .Add(Restrictions.In("Firstname", new string[] { "YJing", "YJingLee", "Y" }))
// .Add(Restrictions.Disjunction()
// .Add(Restrictions.IsNull("Lastname"))
// .Add(Restrictions.Eq("Lastname", "Lee"))
// .Add(Restrictions.Eq("Lastname", "xyz"))
// ).List<Customer>(); //预制的条件类型(Expression的子类)。可以直接嵌入SQL。
//{alias}是一个占位符,它将会被所查询实体的行别名所替代
//Parameter paramName = new Parameter("someName", new StringSqlType());
//IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
// .Add(Expression.Sql(
// new SqlString(new object[]{
// "lower({alias}.Lastname) like lower(","Lastname",")"}), "YJing%", NHibernateUtil.String))
// .List<Customer>();
return customers;
}
/// <summary>
/// 排序Order by
/// </summary>
/// <returns></returns>
public IList<Customer> Order()
{
//使用ICriteria.Order对结果集排序,true=asc,false=desc
return _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Like("Firstname", "Y%"))
.AddOrder(new NHibernate.Criterion.Order("Lastname", true))
.AddOrder(new NHibernate.Criterion.Order("Firstname", false))
.List<Customer>();
}
#endregion

2. 实例学习

        #region 实例学习
/// <summary>
/// 利用CriteriaAPI按Firstname查询顾客
/// </summary>
/// <param name="firstname"></param>
/// <returns>顾客列表</returns>
public IList<Customer> UseCriteriaAPI_GetCustomersByFirstname(string firstname)
{
//NHibernate1.2写法
//return _session.CreateCriteria(typeof(Customer))
// .Add(new NHibernate.Expression.EqExpression("Firstname", firstname))
// .List<Customer>(); //NHibernate2.0写法
//return _session.CreateCriteria(typeof(Customer))
// .Add(Expression.Eq("Firstname", firstname))
// .List<Customer>();
//使用Name封装:.Add(Restrictions.Eq("Name.Firstname", firstname))
return _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Eq("Firstname", firstname))
.List<Customer>();
}
/// <summary>
/// 利用CriteriaAPI按Firstname和Lastname查询顾客
/// </summary>
/// <param name="firstname"></param>
/// <param name="lastname"></param>
/// <returns></returns>
public IList<Customer> UseCriteriaAPI_GetCustomersByFirstnameAndLastname(string firstname, string lastname)
{
//NHibernate1.2写法
//return _session.CreateCriteria(typeof(Customer))
// .Add(new NHibernate.Expression.EqExpression("Firstname", firstname))
// .Add(new NHibernate.Expression.EqExpression("Lastname", lastname))
// .List<Customer>(); //NHibernate2.0写法
//使用Name封装:.Add(Restrictions.Eq("Firstname", firstname))
return _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Eq("Firstname", firstname))
.Add(Restrictions.Eq("Lastname", lastname))
.List<Customer>();
}
/// <summary>
/// 利用CriteriaAPI获取顾客ID大于CustomerId的顾客
/// </summary>
/// <param name="customerId">顾客ID</param>
/// <returns>顾客列表</returns>
public IList<Customer> UseCriteriaAPI_GetCutomersWithIdGreaterThan(int customerId)
{
//NHibernate1.2写法
//return _session.CreateCriteria(typeof(Customer))
// .Add(new NHibernate.Expression.GtExpression("CustomerId", customerId))
// .List<Customer>(); //NHibernate2.0写法
return _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Gt("CustomerId", customerId))
.List<Customer>();
}
#endregion

由于时间的仓促,这里粘贴了主要的代码片段

跟我学 NHibernate (一)的更多相关文章

  1. 大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)

    大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008) 分类: C#2013-08-10 18:47 1589人阅读 评论(5) 收藏 举报 NHibernat ...

  2. 菜鸟学Nhibernate 之路---(1)

    首先说一下我为什么要学这个Nhibernate,现在在公司做项目后台的逻辑层都是用动软生成的简单三层,搞来搞去都是这些东西,代码冗余量很大,每个类方法基本上都一样,真是纯正的码农,虽然后来我也尝试使用 ...

  3. 跟我学 NHibernate (三)

    在使用 NHibernate 时,一定要将Mapping 映射文件,也就是 xml 文件的编译方式设置成 嵌入式,这是因为在 NHibernate 启动时,它会主动的到项目的启动目录中寻找 被设置为嵌 ...

  4. 跟我学 NHibernate (二)

    1. 在 NHibernate 中使用事务, 主要代码如下: #region 事务 public IList<Customer> GetAll() { // 开启事物 using (ITr ...

  5. 华丽的NHibernate

    华丽的NHibernate http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 华丽的NHibernate NHibern ...

  6. NHibernate 数据查询之Linq to NHibernate

    刚学NHibernate的时候觉得,HQL挺好用的,但是终归没有与其他技术相关联,只有NHibernate用到,一来容易忘记,二来没有智能提示,排除错误什么的都不给力,直到看到一个同事用Linq to ...

  7. NHibernate 数据查询之Linto to NHibernate (第八篇)

    NHibernate 数据查询之Linto to NHibernate (第八篇) 刚学NHibernate的时候觉得,HQL挺好用的,但是终归没有与其他技术 相关联,只有NHibernate用到,一 ...

  8. 耗时两月,NHibernate系列出炉

    写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...

  9. 从零开始学 Java - 我放弃了 .NET ?

    这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...

随机推荐

  1. [platform]新旧内核的device设备注册对比

    转自:http://blog.chinaunix.net/uid-7332782-id-3268801.html 1. Version2.6内核启动过程 start_kernel( ) //板子上电启 ...

  2. Android 自定义ScrollView 支持惯性滑动,惯性回弹效果。支持上拉加载更多

    先讲下原理: ScrollView的子View 主要分为3部分:head头部,滚动内容,fooder底部 我们实现惯性滑动,以及回弹,都是靠超过head或者fooder 就重新滚动到  ,内容的顶部或 ...

  3. PO_PO系列 - 收货管理分析(案例)

    2014-07-01 Created By BaoXinjian

  4. [rm] Linux 防止"rm -rf /" 误删除

    一.缘由: 最近看到这则新闻,很是悲伤,因为我最近也在用ansible:然而这一错误源自Ansible上糟糕的代码设计,这款Linux实用工具被用于在多台不同服务器上自动执行脚本. 开发者解释到,实际 ...

  5. js 神代码

    eval(z='p="<"+"pre>"/* ,.oq#+ ,._, */;for(y in n="zw24l6k\ 4e3t4jnt4q ...

  6. bug_ _Popwindow被魅族手机自带虚拟键挡住完美解决

    ========  1 之前做了一个分享的功能,从底部弹出popwindow进行分享,但是由于部分手机自带虚拟键,如魅族X4,所以弹出的popwindow被虚拟键挡住, 在网上找了好多资料,一些资料说 ...

  7. ERWin & ERStudio图里的实线和虚线的含义[转]

    注: ERWin 与 ERStudio 中这一点的描述方法是一样的. ERWin里面线代表实体间的三种关系:决定关系(Identifying Relationship),非决定关系(None-Iden ...

  8. vs2015-Azure Mobile Service

    /App_Data /App_Start/ WebApiConfig.cs using System; using System.Collections.Generic; using System.C ...

  9. 无状态服务(stateless service)

    一.定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本 ...

  10. C++学习29 重载[](下标运算符)

    前面已经提到,下标操作符[]必须以类的成员函数的形式进行重载.在类中的声明格式如下: 返回值类型 & operator[] (参数) 或 const 返回值类型 & operator[ ...