• 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/

  • 相关阅读:
    vbr mp3
    NDK setup error
    转载 MPEG2视频解码在ARM11上的优化
    arm程序设计优化
    小情歌
    android update project
    Linux环境下的DNW使用
    2010的计划
    Setting up UDEV rules to grant access to your phone
    Debugging Native Code for android
  • 原文地址:https://www.cnblogs.com/EmptyFS/p/3202379.html
Copyright © 2020-2023  润新知