上篇文章簡單介紹NHibernate之簡單增刪改查,本文將會簡單介紹有關執行NHibernate的SQL、HQL及存儲過程;
一:執行SQL語句實例,運用CreateSQLQuery方法
public IList<SchoolModel> GetListBySql() { string strSql = "select * from T_School where studentNum>250"; ISQLQuery sqlQuery = isession.CreateSQLQuery(strSql).AddEntity(typeof(SchoolModel)); return sqlQuery.List<SchoolModel>(); }
二:執行存儲過程實例
2.1:首先定義一個存儲過程,傳入一個參數
Create PROCEDURE [dbo].[Pro_Hql] @StudentNum int AS BEGIN select * from T_School where studentNum>@StudentNum END
2.2:引入using System.Data;using NHibernate.Engine命名空間,NHibernateHelper是幫助類返回SessionFactory;當然也可以通過它來執行SQL語句
public IList<SchoolModel> GetListByProcedure() { IList<SchoolModel> list = new List<SchoolModel>(); ISessionFactoryImplementor imp = (ISessionFactoryImplementor)new NHibernateHelper().GetSessionFactory(); IDbConnection conn = imp.ConnectionProvider.GetConnection(); IDbCommand cmd = imp.ConnectionProvider.GetConnection().CreateCommand(); try { cmd.CommandText = "Pro_Hql"; cmd.CommandType = System.Data.CommandType.StoredProcedure; IDbDataParameter parameter = cmd.CreateParameter(); parameter.ParameterName = "StudentNum"; parameter.Value = 250; cmd.Parameters.Add(parameter); cmd.Connection = conn; IDataReader read = cmd.ExecuteReader(); while (read.Read()) { SchoolModel model = new SchoolModel(); model.ID = Guid.Parse(read.GetValue(0).ToString()); model.SchoolName = read.GetValue(1).ToString(); model.BuildDate = DateTime.Parse(read.GetValue(2).ToString()); model.Address = read.GetValue(3).ToString(); model.IsSenior = bool.Parse(read["IsSenior"].ToString()); model.StudentNum = int.Parse(read["StudentNum"].ToString()); list.Add(model); } } catch (Exception ex) { } return list; }
三:執行HQL語句實例,此處用CreateQuery並設置參數用":",當然也可以拼接字符串;
public IList<SchoolModel> GetListByHql() { //實體的名稱跟屬性大小寫都要注意 string hqlStr = "from SchoolModel c where c.StudentNum>:studentNum"; return isession.CreateQuery(hqlStr).SetString("studentNum", "250").List<SchoolModel>(); }
四:Nhibernate也支持Linq的查詢功能,其在命名空間NHibernate.Linq;下面列出一些比較常見:
1、限制運算符
Where:篩選序列中的項目
WhereNot:反篩選序列中的項目
2、投影運算符
Select:創建部分序列的投影
SelectMany:創建部分序列的一對多投影
3、分區運算符(分頁常用到)
Skip:返回跳過指定數目項目的序列
SkipWhile:返回跳過不滿足表達式項目的序列
Take:返回具有指定數目項目的序列
TakeWhile:返回具有滿足表達式項目的序列
4、排序運算符
OrderBy:以升序按值排列序列
OrderByDescending:以降序按值排列序列
ThenBy:升序排列已排序的序列
ThenByDescending:降序排列已排序的序列
Reverse:顛倒序列中項目的順序(用於操作集合)
5、分組運算符
GroupBy:按指定分組方法對序列中的項目進行分組
6、設置運算符
Distinct:返回無重復項目的序列
Except:返回代表兩個序列差集的序列(用於操作集合)
Intersect:返回代表兩個序列交集的序列(用於操作集合)
Union:返回代表兩個序列交集的序列(用於操作集合)
7、轉換運算符
Cast:將序列中的元素轉換成指定類型
OfType:篩選序列中指定類型的元素
ToArray:從序列返回一個數組
ToDictionary:從序列返回一個字典
ToList:從序列返回一個列表
ToLookup:從序列返回一個查詢
ToSequence:返回一個IEnumerable序列
8、元素運算符
DefaultIfEmpty:為空序列創建默認元素(用於操作集合)
ElementAt:返回序列中指定索引的元素(用於操作集合)
ElementAtOrDefault:返回序列中指定索引的元素,或者如果索引超出范圍,則返回默認值(用於操作集合)
First:返回序列中的第一個元素
FirstOrDefault:返回序列中的第一個元素,或者如果未找到元素,則返回默認值
Last:返回序列中的最后一個元素(用於操作集合)
LastOrDefault:返回序列中的最后一個元素,或者如果未找到元素,則返回默認值(用於操作集合)
Single:返回序列中的單個元素
SingleOrDefault:返回序列中的單個元素,或者如果未找到元素,則返回默認值
9、生成運算符
Empty:生成一個空序列
Range:生成一個指定范圍的序列
Repeat:通過將某個項目重復指定次數來生成一個序列
10、限定符
All:確定序列中的所有項目是否滿足某個條件
Any:確定序列中是否有任何項目滿足條件
Contains:確定序列是否包含指定項目
11、聚合運算符
Aggregate:對序列執行一個自定義方法
Average:計算數值序列的平均值
Count:返回序列中的項目數(整數)
LongCount:返回序列中的項目數(長型)
Min:查找數字序列中的最小數
Max:查找數字序列中的最大數
Sum:匯總序列中的數字
12、連接運算符
Concat:將兩個序列連成一個序列
13、聯接運算符
GroupJoin:通過歸組將兩個序列聯接在一起
Join:將兩個序列從內部聯接起來
public IList<SchoolModel> GetSchoolList() { IList<SchoolModel> list = null; list = isession.QueryOver<SchoolModel>().List(); return list; } public IList<SchoolModel> GetListByLinq() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().Where(m => m.IsSenior).List(); return list; } /// <summary> /// 返回符合條件的第一條記錄,當為空是,返回一個各屬性為null的對應類型的對象 /// </summary> /// <returns></returns> public SchoolModel GetModelByLinq() { SchoolModel model = isession.QueryOver<SchoolModel>().WhereNot(m => m.IsSenior).SingleOrDefault(); if (model == null) { return null; } return model; } /// <summary> /// 相當於WHERE /// </summary> /// <returns></returns> public IList<SchoolModel> GetListByLindAnd() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().And(m => m.StudentNum > 390).List(); return list; } /// <summary> /// 相當於反WHERE /// </summary> /// <returns></returns> public IList<SchoolModel> GetListByLindAndNot() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().AndNot(m => m.StudentNum > 400).List(); return list; } /// <summary> /// 增加限制條件 /// </summary> /// <returns></returns> public IList<SchoolModel> GetListByLinqAndRestrictionOn() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().AndRestrictionOn(m => m.SchoolName).IsLike("踏浪", NHibernate.Criterion.MatchMode.Anywhere).List(); return list; } /// <summary> /// 排序 升 /// </summary> /// <returns></returns> public IList<SchoolModel> GetListOrderByAsc() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().OrderBy(m => m.StudentNum).Asc().List(); return list; } /// <summary> /// 排序 降 /// </summary> /// <returns></returns> public IList<SchoolModel> GetListOrderByDesc() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().OrderBy(m => m.StudentNum).Desc().List(); return list; } /// <summary> /// 近回個數 /// </summary> /// <returns></returns> public int GetListByLinqCount() { return isession.QueryOver<SchoolModel>().RowCount(); } /// <summary> /// 這個東西與前面說的AdnRestrictionOn是一樣的,也是可以添加條件啥亂七八糟的 /// </summary> /// <returns></returns> public IList<SchoolModel> GetListByWhereRestritionOn() { int[] intList=new int[]{390,400}; IList<SchoolModel> list = isession.QueryOver<SchoolModel>().WhereRestrictionOn(m => m.StudentNum).IsIn(intList).List(); return list; } /// <summary> /// 跳過指定數量的記錄 /// </summary> /// <returns></returns> public IList<SchoolModel> GetListBySkip() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().Skip(5).List(); return list; } /// <summary> /// 獲取指定數量的記錄,與Skip配合使用是經常用到的分頁效果 /// </summary> /// <returns></returns> public IList<SchoolModel> GetListByTake() { IList<SchoolModel> list = isession.QueryOver<SchoolModel>().Take(10).List(); return list; } /// <summary> /// 告知NHibernate你想要查詢的是什么東西 相當於select StudentNum from T_School /// </summary> /// <returns></returns> public IList<int> GetListBySelect() { IList<int> list = isession.QueryOver<SchoolModel>().Select(m => m.StudentNum).List<int>(); return list; } /// <summary> /// Future()與List()的區別在於Future返回的是IEnumerable<>集合,而List()返回的是IList() /// </summary> /// <returns></returns> public IEnumerable<SchoolModel> GetEnumListByFuture() { IEnumerable<SchoolModel> list = isession.QueryOver<SchoolModel>().Where(m => m.SchoolName == "踏浪帥").Future(); return list; } /// <summary> /// 返回最大值 /// </summary> /// <returns></returns> public int GetByMax() { var StudentNumMax = (from m in GetSchoolList() select m.StudentNum).Max(); return (int)StudentNumMax; } /// <summary> /// 返回最小值 /// </summary> /// <returns></returns> public int GetBYMin() { var StudentNumMin = (from m in GetSchoolList() select m.StudentNum).Min(); return (int)StudentNumMin; } /// <summary> /// 返回平均值 /// </summary> /// <returns></returns> public int GetByAverage() { var StudentNumAverage = (from m in GetSchoolList() select m.StudentNum).Average(); return (int)StudentNumAverage; } /// <summary> /// 返回所有的和 /// </summary> /// <returns></returns> public int GetBySum() { var studentNumSum = (from m in GetSchoolList() select m.StudentNum).Sum(); return (int)studentNumSum; }
感謝您的閱讀,堅持每天進步一點點,離成功就更新一步;希望文章對您有所幫助;
轉載:http://www.cnblogs.com/wujy/p/3581137.html