欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-18 14:53:56
在开发的过程中我们总是会碰到多表操作的需求,今天我分享一个关于查询的方法, 前言:在使用NHibernate中,需要将用户表(Users)、部门表(Departments),链表查询,在网上找了很多资料,可以在配置文件中配置相应的属性达到关联的效果,一对多、多对一、多对多的方式,但是使用后发现有些不 ......

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

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

 

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

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

NHibernate使用--进阶篇(多表查询)
/// <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>(); 这样就得到了连表查询的结果,那么我们该怎么样使用它呢?返回出来的结果集又是什么样子的呢?

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

 

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

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

 

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

NHibernate使用--进阶篇(多表查询)
//创建一个操作类对象  这里还记得嘛?我们在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();
使用返回的结果集

 

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