前段时间开发的框架使用了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. 利用CORS实现跨域请求(转载)

    跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一项新的特性--CORS(Cross-Origin Resource Sh ...

  2. sequelize常见操作使用方法

    关于sequelize的准备工作这里不再赘述. 一.引入sequelize模块 var Sequelize = require('sequelize'); 二.连接数据库 var sequelize  ...

  3. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  4. [IOS]Swift 遍历预制的本地资源文件

    我事先放了一堆svg文件,但是我是批量使用的,想要直接遍历他们加入到一个list中来,那我直接就遍历他们的名称,把他们的名字组成一个array. var ss:NSString = NSBundle. ...

  5. Python之路【第五篇】python基础 之初识函数(一)和文件管理

    转载请注明出处http://www.cnblogs.com/wupeiqi/articles/5453708.html 函数 一.背景                                 ...

  6. java并发编程(十九)障碍器CyclicBarrier

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java 5中加入的新特性,使 ...

  7. Palm是一家英國智能手機公司

    據TCL方面介紹,本次收購只涉及品牌,不會涉及員工和其他資產.被收購之後,Palm仍將繼續把總部設於美國加州矽谷,以發揮該區域所獨有的先進技術和人才的優勢. TCL通訊CEO郭愛平表示TCL將把Pal ...

  8. Android内存清理

    直接上图吧! 获取文件大小 ,清理文件工具类 public class DataCleanManager { public static String getTotalCacheSize(Contex ...

  9. New Career

    Today I received the official confirmation letter with very good grade for the probation, it means t ...

  10. C语言 · 前缀表达式

    问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:"运算符 对象1 对象2",其中,运算符为"+"(加法)."-&q ...