前段时间开发的框架使用了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 = ;
info.AddUserInfoName = "Empty";
info.AddDate = DateTime.Now;
info.Save();
//info.Add(); //也可以使用这个函数进行添加 //修改
info = new Information(x=> x.Id == );
info.Title = "标题";
info.Content = "内容";
info.Url = "http://www.baidu.com";
info.AddUserInfoId = ;
info.AddUserInfoName = "Empty";
info.AddDate = DateTime.Now;
info.Save();
//info.Update(); //也可以使用这个函数进行更新 //删除
info.Delete(); //删除当前记录,比如使用查询或修改获取到的记录
Information.Delete(x => x.Id == ); //删除主键Id为1的记录 //查询
//查询全部记录
IEnumerable<Information> ierr = Information.All();
DataTable dt = ConvertFun.ConvertToDataTable(ierr); //查询指定条件的记录
IList<Information> il = Information.Find(x => x.Id == );
dt = ConvertFun.IListToDataTable(il); //使用Id倒序排序,获取第一页记录(每页10条记录)
il = Information.GetPaged("Id Desc", , );
//il = Information.GetPaged(1, 10); //还可以不加排序 //获取主键列名
string keyColumn = Information.GetKeyColumn(); //判断主键Id为1的记录是否存在
bool isExists = Information.Exists(x => x.Id == ); //获取符合条件的第一条记录实体
info = Information.SingleOrDefault(x => x.Id == ); //------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// 查询类的使用方式
//------------------------------------------------------------------------------- //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().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(""); //添加排序
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(, ); //获取查询语句
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, )); //添加条件
//方法一,直接赋值
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 < );
int count = db.Information.Select(x => x.Id < ).Distinct().Count(); //-------------------------------------------------------------------------------
// HotelDBDB查询类执行存储过程方式
//-------------------------------------------------------------------------------
//使用db.存储过程名称(参数1, 参数2, 参数3);就可以调用存储过程
dt = db.P_All_ListPage("表名", "*", , , , "Id Desc", "Id < 1000", "Id", false).ExecuteDataSet().Tables[];
//可根据存储过程返回的数据,调用不同的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", , );
//添加查询条件
dd.Where<Information>(x => x.Id == && 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 == ); //SimpleRepository调用删除
var sr = new SimpleRepository(SimpleRepositoryOptions.RunMigrations);
sr.Delete<Information>(); //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();
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 == "" && 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, );
//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 == ).Or(InformationTable.IdColumn).IsEqualTo();
batch.QueueForTransaction(query2);
//execute transaction
batch.ExecuteTransaction(); //例二
batch = null;
batch = new BatchQuery(provider); var query3 = from p in db.Information
where
p.Id > && p.Id <
select p;
batch.Queue(query3); var query4 = from p in db.Information
where p.Id ==
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/

SubSonic3.0使用例子的更多相关文章

  1. 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

    前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...

  2. SubSonic3.0 Demo1.0——应用了T4模版可减少开发过程中70%以上的代码量以及80%以上的出错率

    应网友的要求,抽了点时间写了这个Demo,希望对2.2版想升级到3.0的朋友或正在使用3.0的朋友有所帮助.大家在使用Demo过程中如果发现什么问题或有什么建议,可以直接将Bug提交给我或告诉我,我会 ...

  3. 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理

    由于目前开发的项目使用云计算技术,客户端只进行UI与相关事件的功能开发,而所有的计算与处理都放到了服务器端,客户端与数据库没有任何关联,所以服务器端与客户端使用我们自己开发的通讯加密方式进行,而具体的 ...

  4. 为SubSonic3.0的查询(SubSonic.Query.Select和存储过程)添加更多的执行功能

    在使用SubSonic3.0的查询功能时,会发现想通过执行返回我们想要的数据,切没有相关的功能,比如说:SubSonic.Query.Select,在使用查询时没有返回DataSet或DataTabl ...

  5. SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改

    有个群友问SubSonic3.0执行存储过程时能不能使用output参数返回值,说测试过后获取不到返回值,早上有些时间所以就尝试修改了一下 首先在数据库中创建一个存储过程 CREATE PROCEDU ...

  6. 关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复

    早上在编写执行用例时,突然爆异常System.NullReferenceException: 未将对象引用设置到对象的实例 执行代码:

  7. 关于SubSonic3.0插件更新字符串过长引发的System.Data.SqlClient.SqlException的异常修复

    最近公司客服提交了个BUG,说是更新产品详细信息时,有的可以有的更新不了,前段时间一直没空所以暂时放下,刚才又出现这个问题,所以马上处理了一下. 打开项目解决方案,进入DEBUG模式,拿到操作的数据提 ...

  8. SubSonic3.0.0.4.3源码包与调用Dll

    版本修改历史 3.0.0.4.3版修复了下面问题: 修正多表关联查询时,使用左关联和右关联出错问题修正DbDataProvider.cs类的ToEnumerable函数打开数据库链接后没有关闭的问题添 ...

  9. SubSonic3.0使用外连接查询时查询不出数据的问题修改

    今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...

随机推荐

  1. Xml 建议优先使用属性

    要点:建议优先选用属性的方式记录数据,除非还需要包容层级式的数据. 优点: 1. 可以完全覆盖关系型数据库的数据格式设计,利于交换. 2. 占用空间小.相当于 JSON 格式,不再有大量重复的节点名后 ...

  2. dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)

    dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...

  3. 【Beta】Daily Scrum Meeting第五次

    1.任务进度 学号 已完成 接下去要做 502 登陆时将返回的个人信息更新到本地数据库 发布任务到服务器 509 给所有api添加注释 添加及修改职工信息并同步到服务器 517 将提交报课移到报课表界 ...

  4. C及C++中typedef的简单使用指南

    又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...

  5. Metaio获取当前追踪的对象的方法

    重写 onTrackingEvent获取TrackingValues集合,然后通过TrackingValues的state属性的isTrackingState()方法判断是否为追踪状态,或者直接使用s ...

  6. Centos 6.5 部署 redmine 3.3

    验证ruby版本 如果有就卸载安装最新的 yum install gcc* openssl openssl-devel -y wget https://ruby.taobao.org/mirrors/ ...

  7. SQL多表合并查询结果

    两表合并查询,并同时展示及分页SELECT a.* FROM ( ( SELECT punycode, `domain`, 'Success' AS state, add_time, AS refun ...

  8. ASP.net之策略模式

    设计思路: 用ASP.net设计,调用策略模式.在第一个数和第二个数的文本框中输入数值,单击录题按钮,数值保存在n1,n2文档中,把要做的题都保存完后,单击开始按钮,开始做题,做完单击判断按钮,进行判 ...

  9. 输出 n=6 的三角数字阵(JAVA基础回顾)

    package itcast.feng; import java.util.Scanner; //需求:输出 n=6 的三角数字阵 //1 //2 3 //4 5 6 //7 8 9 10 //11 ...

  10. 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

    关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...