• 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;
            }

    感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;

  • 相关阅读:
    c++ Knight Moves 超级升级版
    百度招聘彩蛋
    C++ 八数码问题宽搜
    c++ 动态规划(数塔)
    c++ 深度优先搜索(迷宫)
    c++ 宽搜(倒水)
    c++ matrix逆时针螺旋
    c++ 基数排序
    c++ 二分答案(解方程)
    c++ 二分答案(数组查找)
  • 原文地址:https://www.cnblogs.com/wujy/p/3581137.html
Copyright © 2020-2023  润新知