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();
结束了---------