zoukankan      html  css  js  c++  java
  • SubSnoic 框架入门到提高(2)全程记录

    上篇说到了 subsonic 的配置与然后根据数据库生成实体操作类

    下面我们继续学习,他的逻辑处理语句

    为了方便演示,我就不建什么框架了,直接UI层用控制台了,还请见谅

    右键上次的那个项目 ,添加 控制台应用程序:SubSonicUI

    然后把 SubSonicDAL层下的app.config文件复制到 SubSonicUI 程序集下,注意你添加的控制台默认使用的framework是 .Net FrameWork4 Client Profile,将它改成 .Net FrameWork4

    如图:

    然后添加 SubSonic.dll  和 System.configuration.dll  类库的引用,还有StudentMGR类库的引用     完成后如下:

    下面我们一起具体学习吧,本人也不过也是初学者哦!呵呵

     

    一、单条件单表 查询

           //基本查询,查询出所有学生的信息
                DataTable dt = new Select().From(Student.Schema).ExecuteDataSet().Tables[0];
                foreach (DataRow item in dt.Rows)
                {
                    Console.WriteLine(item[0]+"\t"+item[1]+"\t"+item[2]);
                }

     或者

         IDataReader dr = Student.FetchAll();
                while (dr.Read())
                {
                    Console.WriteLine(dr["StudentId"] + "\t" + dr["StudentName"] + "\t" + dr["StudentHobby"]);
                }

    二、查出姓名叫小龙的爱好

         Student st = new Select(Student.Columns.StudentHobby).From(Student.Schema).Where("StudentName").IsEqualTo("小龙").ExecuteSingle<Student>();

    或者

        Student st = new Select("StudentHobby").From(Student.Schema).Where("StudentName").IsEqualTo("小龙").ExecuteSingle<Student>();

    或者

      Student st = new Select("StudentHobby").From<Student>().Where("StudentName").IsEqualTo("小龙").ExecuteSingle<Student>();

    或者

       Student st = new Select("StudentHobby").From<Student>().Where(Student.StudentNameColumn).IsEqualTo("小龙").ExecuteSingle<Student>();

    或者

       Student st = DB.Select("StudentHobby").From<Student>().Where(Student.StudentNameColumn).IsEqualTo("小龙").ExecuteSingle<Student>();

    或者

                Student st = new Student();
                Query qu = new Query(Student.Schema);
                qu.WHERE("StudentName==小龙");
                qu.SelectList =Student.Columns.StudentHobby;
                IDataReader dr = Student.FetchByQuery(qu);
                while (dr.Read())
                {
                    st.StudentHobby = dr[0].ToString();
                }
                Console.WriteLine("小龙的爱好是:"+st.StudentHobby);

    或者

                Student st = new Student();
                Query qu = new Query(Tables.Student);   //这行不一样
                qu.WHERE("StudentName==小龙");
                qu.SelectList =Student.Columns.StudentHobby;
                IDataReader dr = Student.FetchByQuery(qu);
                while (dr.Read())
                {
                    st.StudentHobby = dr[0].ToString();
                }
                Console.WriteLine("小龙的爱好是:"+st.StudentHobby);

    或者

                Student st = new Student();
                Query qu = new Query("Student");  //这行不一样
                qu.WHERE("StudentName==小龙");
                qu.SelectList =Student.Columns.StudentHobby;
                IDataReader dr = Student.FetchByQuery(qu);
                while (dr.Read())
                {
                    st.StudentHobby = dr[0].ToString();
                }
                Console.WriteLine("小龙的爱好是:"+st.StudentHobby);

    或者  注意列名称的使用哦,都经过测试的哦

                DataSet sts = new Query(Tables.Student).WHERE("StudentName==小龙").ExecuteDataSet();
                foreach (DataRow item in sts.Tables[0].Rows)
                {
                    Console.WriteLine("小龙的爱好是:" + item["StudentHobby"]);
                    Console.WriteLine("小龙的爱好是:" + item[2]);
                    Console.WriteLine("小龙的爱好是:" + item[Student.Columns.StudentHobby]);
                    Console.WriteLine("小龙的爱好是:" + item[Student.StudentHobbyColumn.ToString()]);
                }

     三、查出爱好是中国象棋的人,按学生姓名排序降序显示

               DataSet sts = new Query(Tables.Student).WHERE("StudentHobby==中国象棋").ORDER_BY("StudentName desc").ExecuteDataSet();
                foreach (DataRow item in sts.Tables[0].Rows)
                {
                    Console.WriteLine(item["StudentId"]+"\t"+item["StudentName"] + "\t" + item["StudentHobby"]);
                }

    按照学生id  升序显示

      DataSet sts = new Query(Tables.Student).WHERE("StudentHobby==中国象棋").ORDER_BY("StudentId asc").ExecuteDataSet();
                foreach (DataRow item in sts.Tables[0].Rows)
                {
                    Console.WriteLine(item["StudentId"]+"\t"+item["StudentName"] + "\t" + item["StudentHobby"]);
                }

    where里面的条件也可以这样写

    DataSet sts = new Query(Tables.Student).WHERE("StudentHobby","中国象棋").ORDER_BY("StudentId asc").ExecuteDataSet();

    多条件多表查询

    1、查出张老师班喜欢英语的学生的信息
               //查出张老师班喜欢英语的学生的信息
                IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn,Teacher.TeacherNameColumn).From<Student>().InnerJoin<Teacher>().Where("StudentHobby").Like("%英语%").And("TeacherName").IsEqualTo("张老师").ExecuteReader();
                while (dr.Read())
                {
                    Console.WriteLine(dr["StudentId"] + "\t" + dr["StudentName"] + "\t" + dr["StudentHobby"] + "\t" + dr["TeacherName"]);
                }

    注意,我这里有点不严谨,你发现了吗

    你可用一下语句,可以查看一下后面select生成的sql语句

      SqlQuery q = new Select(Student.StudentIDColumn, Student.StudentNameColumn, Student.StudentHobbyColumn, Teacher.TeacherNameColumn).From(Student.Schema).
                    InnerJoin<Teacher>().Where("StudentHobby").Like("%英语%").And("TeacherName").IsEqualTo("张老师");

    然后

       Console.WriteLine(q.ToString());

    输出下面一句话(我们熟悉的sql):

    SELECT [dbo].[Student].[StudentID], [dbo].[Student].[StudentName], [dbo].[Student].[StudentHobby], [dbo].[Teacher].[TeacherName]
     FROM [dbo].[Student]
     INNER JOIN [dbo].[Teacher] ON [dbo].[Student].[TeacherID] = [dbo].[Teacher].[TeacherID]
     WHERE [dbo].[Student].[StudentHobby] LIKE @StudentHobby0
     AND [dbo].[Teacher].[TeacherName] = @TeacherName1

    我的建议多表查询这样写,还可以避免一下类似的错误,下面是我的员工,部门,职位,三张表的查询,由于不规范,会偶尔出这样的错误,如果有疑问,你就把你的subsonic语句用SqlQuery 类型的变量保存起来,然后输出,你看看输出来的sql语句是什么样的就知道了

    下面我把我的员工部门职位 正确的三张表的查询 语句发一下吧,来体现多表查询 正好学习一下

      SqlQuery q = new Select(Employee.Columns.Number, Role.Columns.Title, Department.Columns.Title).
    From<Employee>().
    InnerJoin(Department.IdColumn, Employee.DepartmentIdColumn).
    InnerJoin(Role.IdColumn, Employee.RoleIdColumn);

    生成的sql语句

    我把他复制到sqlserver2008中查询的时候,执行,正是我想要的结果。备注:这样写,可以解决多表中要显示的列名  如果列名是一样,只显示某张表中的那列数据的问题,如例子:员工的姓名列名叫 Title,而部门的名称 列名 也叫 Title ,职位的列名 也叫 Title

    注意: InnerJoin(f1,f2)  , 其中f1的为关联的表,而 f2为主表(此例子中是Employee),如果报了此类错误,请调一下 关联的 InnerJoin中的两个参数的位置,反正我是这样解决的,也总结出来了,因为我也是“受害者”,呵呵

    所以呢

    上面的subsonic语句该怎么改?

      IDataReader dr = new Select(Student.StudentIDColumn, Student.StudentNameColumn, Student.StudentHobbyColumn, Teacher.TeacherNameColumn).From(Student.Schema).
                    InnerJoin(Teacher.TeacherIDColumn, Student.TeacherIDColumn).Where("StudentHobby").Like("%英语%").And("TeacherName").IsEqualTo("张老师").ExecuteReader();

    其中InnerJoin如果你看它的提示的话,还可以这样写:

        IDataReader dr = new Select(Student.StudentIDColumn, Student.StudentNameColumn, Student.StudentHobbyColumn, Teacher.TeacherNameColumn).From(Student.Schema).
        InnerJoin("Teacher","TeacherID","Student","TeacherID").Where("StudentHobby").Like("%英语%").And("TeacherName").IsEqualTo("张老师").ExecuteReader();

    两张表查询,应该不要这么规范吧,应该也就无所谓了,但我觉得还是规范的好,具体学习,还是看提示拓展的。

    用InnerJoin方法关联,关联其他表的,这就是多表了然后你在前面再加上该表的某些列名就行了,好像没有sql语句好,我还是宁愿用sql语句写起来顺手,还可以左查询,右查询,左外查询,右外查询,全查询,交并且查询,子查询(不过,这个也包括子查询,竟然你选择用subsonic生成了代码,你就要听他的了,哎)等,不过subsonic也带

    例如: LeftInnerJoin() , LeftInnerJoin<T>()          

             RightInnerJoin() , RightInnerJoin<T>() 

             LeftOuterJoin() , LeftOuterJoin<T>()     

             RightOuterJoin() , RightOuterJoin<T>() 

             OuterJoin(),         OuterJoin<T>()

            CrossJoin(),          CrossJoin<T>()  等,怎么用应该不用我说了吧,不过你好像需要sql的基础

    Like模糊查询,IsEqualTo精确查询,And增加一个查询条件

    From<Student>()   等同于 From("Student")   等同于    From(Tables.Student)  等同于 From(Student.Schema)           哇靠!这么多种,列名的显示方法 也有很多

    Select()  括弧里面放要显示的列名,呵呵,感觉你既要有sql的理解基础,还要 linq的理解基础,哎~ 其实linq的链式编程,那么网页上的 jquery的链式应该也懂咯,下次有机会再从基础到提高讲一下jquery吧

    哦,提醒一下,那个where里面的条件,查询比较字符串,例如 WHERE("StudentHobby==中国象棋")  ,用双等于号,比较数字用 但等于号 "="  ,可以用 ">"  "<"等

     再讲一点where后面的 . 后面的某些方法吧

    ① 找出编号小于5的学生信息 IsLessThan()

           IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn).From(Student.Schema).Where("StudentID").IsLessThan(5).ExecuteReader();
                while (dr.Read())
                {
                    Console.WriteLine(dr["StudentId"] + "\t" + dr["StudentName"] + "\t" + dr["StudentHobby"]);
                }

    ② 找出编号小于等于5的学生信息   IsLessThanOrEqualTo()

    IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn).From(Student.Schema).Where("StudentID").IsLessThanOrEqualTo(5).ExecuteReader();

    同理 大于,大于等于的两个方法分别是    IsGreaterThan() ,  IsGreaterThanOrEqualTo()

    ③找出编号在5到10之间的,包括5和10,包括不包括应该知道怎么写了吧 (有点分页思想哦!)

       我在这里写,只是为了体现某些细的知识点,随便看就知道了

       第一种

                IDataReader dr = new Select(Student.StudentIDColumn,Student.StudentNameColumn,Student.StudentHobbyColumn).From(Student.Schema).Where("StudentID").IsGreaterThanOrEqualTo(5).And("StudentID").IsLessThanOrEqualTo(10).ExecuteReader();

    把5 和 10 用动态变量替换一下就够了,对不?

     第二种,不建议,我只是教你  In()  的用法,不过好像4.0用不了,我看它的错误,好像只能用在framework 2.0 里面的

                ArrayList list = new ArrayList();
                for (int i = 5; i <= 10; i++)
                {
                    list.Add(i);
                }
    
                IDataReader dr = new Query("Student").IN("StudentId", list).ExecuteReader();

    或者

    IDataReader dr = new Query("Student").IN("StudentId", new object[]{5,6,7,8,9,10}).ExecuteReader();

    我在4.0里面失败了!  Query 我在这里就不细讲了,我会在一个地方,将它细讲的,看不懂的有疑问的,先放着吧,因为我发现query有好多用法

     

    先暂时写在这,好对不起,这几天挺忙的

     

  • 相关阅读:
    Python 魔法方法
    使用PHP7来批量更新MangoDB数据
    git 小乌龟安装教程
    webpack初学者(1)
    移动端与PC端的触屏事件
    解决onclick事件的300ms延时问题
    尺寸单位em,rem,vh,vw
    ngRoute 与ui.router区别
    angular.js的依赖注入解析
    ionic的基础学习(第一篇)
  • 原文地址:https://www.cnblogs.com/AaronYang/p/2511849.html
Copyright © 2011-2022 走看看