NHibernate初學二之簡單執行SQL及HQL、Linq


上篇文章簡單介紹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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM