在開發的過程中我們總是會碰到多表操作的需求,今天我分享一個關於查詢的方法, 前言:在使用NHibernate中,需要將用戶表(Users)、部門表(Departments),鏈表查詢,在網上找了很多資料,可以在配置文件中配置相應的屬性達到關聯的效果,一對多、多對一、多對多的方式,但是使用後發現有些不 ...
在開發的過程中我們總是會碰到多表操作的需求,今天我分享一個關於查詢的方法,
前言:在使用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();使用返回的結果集
結束了---------