上篇说到了 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有好多用法
先暂时写在这,好对不起,这几天挺忙的