SubSonic3.0使用例子
前段时间开发的框架使用了SubSonic2.2以后,觉得开发效率提高了不少,后期维护起来也非常方便,不由的喜欢上了SubSonic。中间有想过升级到更高版本,但度娘一下就放弃了,只有极少的中文版说明,而且中文版说明大多也是从英文版的DOC文档里翻译过来,没有更详细更细致的说明。使用SubSonic2.2一段时间后,觉得SubSonic插件虽然技术很成熟,但有一些调用起来不是很灵活,比较繁琐,所以一直想了解3.0,看看有没有更好更新的改进。SubSonic有很多人在用,使用SubSonic2.2版本以下的人也很多,但3.0以后就好像少了,有时想查找3.0的相关中文资料,找来找去就那几篇,对于更详细的说明介绍就很少,逼得没办法,只能自己来研究了。这段时间公司有新的项目,所以一开始就想称这个机会,学习一下3.0并应用到项目当中。前几天弄好开发的相关文档与数据字典后,就开始学习3.0,前后经历了两天多非常痛苦的日子(不停的使用度娘,最后找不到相关文档以后,只能进入官网查看E文说明,然后查看插件源码,了解相关的调用),终于搞定了3.0并将框架搭建了起来。然后赶快编写了本使用说明例子,给同事熟悉。
SubSonic3.0给我最大的感受就是比2.2版本大大的减负了,更加个性化。去掉了很多重复的功能,增加了Linq的应用,数据库生成模版可以根据自己的需要随意修改......不过也存在不少小问题,比如有一些必要属性没有了(例如使用Select或SqlQueue查询时需要使用Distinct,怎么找不找不到,使用db.表名.Select().Distinct()才有).....对于这些问题,如果不自己修改源码的添加相关功能的话,那只能使用硬编码,直接使用SQL语句了.....当然也有可能是我自己还没有找到调用方法
例子中有一些代码未经过调试(由于是一口气写出来,没有执行过),可能运行时会存在问题,敬请谅解,有的调用函数是我自己修改官方源码添加了,官方的Dll里并不包含此功能,所以会存在无法编译的现象,请将那段代码注释掉就可以了。发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群(327360708)或Email给我(1654937#qq.com),大家一起探讨,由于本人工作很繁忙,如果疑问请先留言,回复不及时也请谅解。
下面是SubSonic3.0常用的调用例子
public void test() { //获取数据源——主要用于绑定连接的服务器,如果有多台服务器多个数据库时,可使用不同的数据源来进行绑定查找 var provider = SubSonic.DataProviders.ProviderFactory.GetProvider(); //定义事务,给后面的事务调用 var batch = new BatchQuery(provider); //------------------------------------------------------------------------------- // 实体Model类增删查改使用方式 //------------------------------------------------------------------------------- //新增 Information info = new Information(); info.Title = "标题"; info.Content = "内容"; info.Url = "http://www.baidu.com"; info.AddUserInfoId = 1; info.AddUserInfoName = "Empty"; info.AddDate = DateTime.Now; info.Save(); //info.Add(); //也可以使用这个函数进行添加 //修改 info = new Information(x=> x.Id == 1); info.Title = "标题"; info.Content = "内容"; info.Url = "http://www.baidu.com"; info.AddUserInfoId = 1; info.AddUserInfoName = "Empty"; info.AddDate = DateTime.Now; info.Save(); //info.Update(); //也可以使用这个函数进行更新 //删除 info.Delete(); //删除当前记录,比如使用查询或修改获取到的记录 Information.Delete(x => x.Id == 1); //删除主键Id为1的记录 //查询 //查询全部记录 IEnumerable<Information> ierr = Information.All(); DataTable dt = ConvertFun.ConvertToDataTable(ierr); //查询指定条件的记录 IList<Information> il = Information.Find(x => x.Id == 1); dt = ConvertFun.IListToDataTable(il); //使用Id倒序排序,获取第一页记录(每页10条记录) il = Information.GetPaged("Id Desc", 1, 10); //il = Information.GetPaged(1, 10); //还可以不加排序 //获取主键列名 string keyColumn = Information.GetKeyColumn(); //判断主键Id为1的记录是否存在 bool isExists = Information.Exists(x => x.Id == 1); //获取符合条件的第一条记录实体 info = Information.SingleOrDefault(x => x.Id == 1); //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- // 查询类的使用方式 //------------------------------------------------------------------------------- //Select,是SqlQuery的子类,将Select直接换成SqlQuery也可以,两者只有个另属性与方法不同 Select select = new Select(); //只显示指定的列 //Select select = new Select(new string[] { InformationTable.IdColumn, InformationTable.TitleColumn }); select.From<Information>(); //添加查询条件 select.Where(InformationTable.IdColumn).IsLessThanOrEqualTo(10).And(InformationTable.TitleColumn).StartsWith("标"); select.Where<Information>(x => x.Title == "标题"); //查询时括号添加例子 //select.Openexpression_r().Where("").IsEqualTo(0).Or("").IsEqualTo(11).Closeexpression_r().And("").IsEqualTo(3); //设置去重复——SubSonic没有去重复选项,需要自己手动修改Dll源码 select.Distinct(true); //或 //select.IsDistinct = true; //设置查询数量 select.Top("10"); //添加排序 select.OrderAsc(InformationTable.IdColumn); select.OrderDesc(InformationTable.TitleColumn); //或 //List<string> orderbyList = new List<string>(); //orderbyList.Add(InformationTable.IdColumn + " Asc"); //orderbyList.Add(InformationTable.TitleColumn + " Desc"); //select.OrderBys = orderbyList; //设为删除语句,默认为QueryType.Select //select.QueryCommandType = QueryType.Delete; //select.Execute(); //设置分页,获取第一页记录(每页10条记录) select.Paged(1, 10); //获取查询语句 string sql = select.SQLCommand; //执行查询 dt = select.ExecuteDataTable(); //int n = select.Execute(); //IDataReader idr = select.ExecuteReader(); //object obj = select.ExecuteScalar(); //info = select.ExecuteScalar<Information>(); //info = select.ExecuteSingle<Information>(); //List<Information> lif = select.ExecuteTypedList<Information>(); //List<Information> lif = select.ToList<Information>(); //查询总记录数 select.GetRecordCount(); //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- // 三种为SqlQuery添加条件的方式 //------------------------------------------------------------------------------- //定义 SqlQuery sqlQuery = new Select().From<InformationTable>(); //设为删除语句 //sq.QueryCommandType = QueryType.Delete; //创建条件 List<ConditionFun.SqlqueryCondition> list = new List<ConditionFun.SqlqueryCondition>(); list.Add(new ConditionFun.SqlqueryCondition(ConstraintType.And, InformationTable.IdColumn, Comparison.LessOrEquals, 10)); //添加条件 //方法一,直接赋值 sqlQuery.Constraints = ConditionFun.SqlqueryCondition.Condition(list); //方法二,使用函数赋值,本方法可以使用在一连串命令一起使用时(即后面还可以继续使用.来添加其他命令) //sq.Where(ConditionFun.SqlqueryCondition.Condition(wheres)); //方法三,使用自定义函数添加绑定 //ConditionFun.SqlqueryCondition.AddSqlqueryCondition(sq, wheres); //执行语句 sqlQuery.Execute(); //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- // HotelDBDB查询类的使用方式 //------------------------------------------------------------------------------- HotelDBDB db = new HotelDBDB(); //平均值 db.Avg<Information>(x => x.Id); //最大值 db.Max<Information>(x => x.AddDate); //最小值 db.Min<Information>(x => x.AddDate); //计算数量 db.Count<Information>(x => x.AddUserInfoId); //其他例子 IQueryable iqb = db.Information.Select(x => x.Id < 10); int count = db.Information.Select(x => x.Id < 10).Distinct().Count(); //------------------------------------------------------------------------------- // HotelDBDB查询类执行存储过程方式 //------------------------------------------------------------------------------- //使用db.存储过程名称(参数1, 参数2, 参数3);就可以调用存储过程 dt = db.P_All_ListPage("表名", "*", 1, 10, 78, "Id Desc", "Id < 1000", "Id", false).ExecuteDataSet().Tables[0]; //可根据存储过程返回的数据,调用不同的Execute来获取 //------------------------------------------------------------------------------- // 直接执行QueryCommand的方式 //------------------------------------------------------------------------------- sql = "select * from Information"; //执行SQL语句 //例一 QueryCommand qcommand = new QueryCommand(sql, provider); qcommand.Provider.ExecuteQuery(qcommand); //例二 //创建执行对象 var q = new SubSonic.Query.QueryCommand(sql, provider); q.Provider.ExecuteQuery(q); //例三 batch.QueueForTransaction(qcommand); batch.ExecuteTransaction(); //例四 provider.ExecuteQuery(qcommand); //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- // 使用SimpleRepository查询方式 //------------------------------------------------------------------------------- //翻页 var repo = new SimpleRepository(SimpleRepositoryOptions.RunMigrations); //排序和分页 var dd = repo.GetPaged<Information>(InformationTable.IdColumn + " desc", 0, 10); //添加查询条件 dd.Where<Information>(x => x.Id == 1 && x.Title == "标题" && x.Url.StartsWith("度娘")); //获取查询结果1 foreach (Information info2 in dd) { Console.WriteLine(info2.Title); } //获取查询结果2 List<Information> li = dd.ToList<Information>(); //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- // 各种删除方式 //------------------------------------------------------------------------------- //实体类直接调用删除 Information.Delete(x => x.Id == 0); //SimpleRepository调用删除 var sr = new SimpleRepository(SimpleRepositoryOptions.RunMigrations); sr.Delete<Information>(0); //QueryCommand删除 var qd = new SubSonic.Query.QueryCommand("delete from Information where Id = 1", provider); qd.Provider.ExecuteQuery(q); //SqlQuery删除 SqlQuery sq = new Select().From<Information>(); //设为删除语句 sq.QueryCommandType = QueryType.Delete; //添加删除条件 sq.Where(InformationTable.IdColumn).IsEqualTo(1); sq.Execute(); //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- // 各种查询方式 //------------------------------------------------------------------------------- //Linq查询方式 db = new HotelDBDB(); var query = new Query<Information>(db.Provider); var posts = from p in query where p.Title.StartsWith("M") select p; query = db.GetQuery<Information>(); posts = from p in query where p.Title.StartsWith("M") select p; //获取查询结果1 foreach (Information info2 in posts) { Console.WriteLine(info2.Title); } //获取查询结果2 List<Information> li2 = query.ToList<Information>(); //------------------------------------------------------------------------------- //Linq多表联合查询方法 var query5 = from r in RoomInfo.All() join rt in RoomType.All() on r.RoomTypeId equals rt.Id where r.RoomNo == "1708" && rt.TypeName == "标准单人房" select r; //获取查询结果2 List<Information> li3 = query.ToList<Information>(); var qry = (from c in db.RoomInfos join d in db.RoomTypes on c.RoomTypeId equals d.Id select new RoomListView { RoomNo = c.RoomNo, IsPost = c.IsPost, TypeName = d.TypeName }); foreach (var view in qry) { string RoomNo = view.RoomNo; byte? IsPost = view.IsPost; string TypeName = view.TypeName; } //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- //多个SQL语句需要执行时,可以使用事务 //例一 var query1 = new SubSonic.Query.Delete<Information>(InformationTable.IdColumn, 1); //var query1 = new SubSonic.Query.Delete<Information>(provider).Where<Information>(x => x.Id == 1).And<Information>(x => x.RoomTypeId == 1); batch.QueueForTransaction(query1); var query2 = new SubSonic.Query.Delete<Information>(provider).Where<Information>(x => x.Id == 2).Or(InformationTable.IdColumn).IsEqualTo(3); batch.QueueForTransaction(query2); //execute transaction batch.ExecuteTransaction(); //例二 batch = null; batch = new BatchQuery(provider); var query3 = from p in db.Information where p.Id > 1 && p.Id < 10 select p; batch.Queue(query3); var query4 = from p in db.Information where p.Id == 20 select p; batch.Queue(query4); using (var rdr = batch.ExecuteReader()) { if (rdr.Read()) { //query1 results } //rdr.MoveNext(); rdr.NextResult(); if (rdr.Read()) { //query2 results } } //------------------------------------------------------------------------------- } //内部类 class RoomListView { public string RoomNo { get; set; } public byte? IsPost { get; set; } public string TypeName { get; set; } }
本文章为原创内容,转载请保留下面信息。
想了解更多SubSonic3.0的相关问题,请观注博客:http://www.cnblogs.com/EmptyFS/