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有好多用法

 

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

 

原文地址:https://www.cnblogs.com/AaronYang/p/2511849.html