NHibernate使用--进阶篇(多表查询)

在开发的过程中我们总是会碰到多表操作的需求,今天我分享一个关于查询的方法,

前言:在使用NHibernate中,需要将用户表(Users)、部门表(Departments),链表查询,在网上找了很多资料,可以在配置文件中配置相应的属性达到关联的效果,一对多、多对一、多对多的方式,但是使用后发现有些不便,尤其时刚开始接触NHibernate,有点儿难理解,现在我使用一种新的方法,使用我们最熟悉的SQL来完成相关功能

 

1.0 首先我们需要把环境配置好,请参考我前面的随笔,

2.0 我们在NHibernateSample中定义一个方法

/// <summary>
        /// 查询所有数据
        /// </summary>
        /// <returns></returns>
        public IList<Object> GetCustomers()
        {
            return Session.CreateSQLQuery("select  A.*,B.* from Users A ,Departments B WHERE A.Dept_id = B.dept_id")
                .AddEntity(typeof(Users)).AddEntity(typeof(Departments)).List<Object>();
              
            //return Session.QueryOver<MyDepartments>().List();
        }
查询方法

  

  正如上图所属我们使用了连表查询, 这个时候查询出来的结果是两张表的公共交集 包含所有的字段,随后我们在后面使用.AddEntity(typeof(Users))NHibernateSample会在编译的时候获取我们传入的类型,随即找到相应的配置文件,根据配置文件相应的配置,就可以将我们的类中的字段和数据库查询结果的字段一一对应 ,然后生成相应的结果集,最后我们输出.List<Object>(); 这样就得到了连表查询的结果,那么我们该怎么样使用它呢?返回出来的结果集又是什么样子的呢?

 

 

返回出来的结果集的样子:NHibernateSample将数据库中的一行数据对应到我们给定的实体类对象,因此集合中每一个对象又包含两个对象一个是部门属性/值的集合,另一个是用户属性/值的集合  

 

该怎么样使用它 :手动的拼装返回的结果集

//创建一个操作类对象  这里还记得嘛?我们在NHibernateSample操作类的构造函数中声明了一个ISession的参数 这里我们调用帮助类的GetSession()方法返回一个ISession
            NHibernateSample _sample = new NHibernateSample(new NHibernateHelper().GetSession());


            //声明一个对象的集合  由于是多对一的关系 所以我在用户类中自定义了一个部门类型的属性字段
            List<Users> list_u = new List<Users>();

            //存放数据库返回的查询结果
            IList<Object> list_o = _sample.GetCustomers();

            //这里因为返回的是Object类型 所以只能用for循环 不能使用foreach
            for (int i = 0; i < list_o.Count; i++)
            {
                //获取集合中的对象
                Object[] isu_d = (Object[])_sample.GetCustomers()[i];

                //将当前对象中的第一个用户属性/值的对象集合插入到U对象中
                Users u = (Users)isu_d[0];

                //将当前对象中的第二个部门属性/值的对象集合插入到U对象的Departments(相应的部门类型属性 上面提到过的)中
                u.Departments = (Departments)isu_d[1];
                //添加到集合中
                list_u.Add(u);
            }
            //最后返回的就是 用户的集合list_u  在用户中的属性Departments包含了相对应的部门信息
            list_u.Count();
使用返回的结果集

 

结束了---------

 

posted @ 2017-12-19 11:33  程序黄金猿  阅读(1628)  评论(13编辑  收藏  举报