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/

posted @ 2013-07-20 14:29  AllEmpty  阅读(3998)  评论(6编辑  收藏  举报