前段时间开发的框架使用了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. HDU 3584 Cube (三维 树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584 Cube Problem Description Given an N*N*N cube A,  ...

  2. 用.net在画出镂空图片

    最近的一个项目需要用到这个东西,冥思苦想了好几天.还是在同事的帮助下,完成此项难题,希望能够帮助以后的博友们 ! 废话不多说,先看看效果图吧. 首先写一下讲一下思路,首先画一张图,当你的背景,然后在图 ...

  3. js数组操作总结

    1.数组的检测 ECMAScript3    if(value instanceof Array){ //执行操作 }    假定单一全局环境,如果网页存在多个框架,多个window,Array具有不 ...

  4. 【OAuth2.0】Spring Security OAuth2.0篇之初识

    不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握 ...

  5. centos上安装pygame

    安装前依赖包检查及安装 python-devel SDL_image-devel SDL_mixer-devel SDL_ttf-devel SDL-devel numpy subversion po ...

  6. PHP 通过百度API 实现通过城市名称获取经度

    $city = $_GET['city'];print_r(getjw($city));/*** $city 需要查询的地址* $key 百度开发者账号*/function getjw($city){ ...

  7. Unity3d使用高通Vuforia发布IOS工程不支持64位的一些解决办法

    1.将Unit升级至4.6.x或5.0.x,将Vuforia差距升级到最新版本(vuforia-unity-mobile-android-ios-4-0-105 ) 2.平台Other Setting ...

  8. SDOI 2016 排列计数

    题目大意:一个数列A,n个元素,其中m个元素不动,其他元素均不在相应位置,问有多少种排列 保证m个元素不动,组合数学直接计算,剩余元素错位排列一下即可 #include<bits/stdc++. ...

  9. ie8 jquery parents() 获取多个的问题

    今天开发的时候碰到了一个奇怪的问题 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3 ...

  10. PHP Strict Standards:问题解决

    异常信息: ( ! ) Strict standards: Declaration of SugarEmailAddress::save() should be compatible with tha ...