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 = ;
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使用例子的更多相关文章
- 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)
前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...
- SubSonic3.0 Demo1.0——应用了T4模版可减少开发过程中70%以上的代码量以及80%以上的出错率
应网友的要求,抽了点时间写了这个Demo,希望对2.2版想升级到3.0的朋友或正在使用3.0的朋友有所帮助.大家在使用Demo过程中如果发现什么问题或有什么建议,可以直接将Bug提交给我或告诉我,我会 ...
- 关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理
由于目前开发的项目使用云计算技术,客户端只进行UI与相关事件的功能开发,而所有的计算与处理都放到了服务器端,客户端与数据库没有任何关联,所以服务器端与客户端使用我们自己开发的通讯加密方式进行,而具体的 ...
- 为SubSonic3.0的查询(SubSonic.Query.Select和存储过程)添加更多的执行功能
在使用SubSonic3.0的查询功能时,会发现想通过执行返回我们想要的数据,切没有相关的功能,比如说:SubSonic.Query.Select,在使用查询时没有返回DataSet或DataTabl ...
- SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改
有个群友问SubSonic3.0执行存储过程时能不能使用output参数返回值,说测试过后获取不到返回值,早上有些时间所以就尝试修改了一下 首先在数据库中创建一个存储过程 CREATE PROCEDU ...
- 关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复
早上在编写执行用例时,突然爆异常System.NullReferenceException: 未将对象引用设置到对象的实例 执行代码:
- 关于SubSonic3.0插件更新字符串过长引发的System.Data.SqlClient.SqlException的异常修复
最近公司客服提交了个BUG,说是更新产品详细信息时,有的可以有的更新不了,前段时间一直没空所以暂时放下,刚才又出现这个问题,所以马上处理了一下. 打开项目解决方案,进入DEBUG模式,拿到操作的数据提 ...
- SubSonic3.0.0.4.3源码包与调用Dll
版本修改历史 3.0.0.4.3版修复了下面问题: 修正多表关联查询时,使用左关联和右关联出错问题修正DbDataProvider.cs类的ToEnumerable函数打开数据库链接后没有关闭的问题添 ...
- SubSonic3.0使用外连接查询时查询不出数据的问题修改
今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...
随机推荐
- CentOS 简单设置samba服务
1.安装 yum -y install samba 2.设置配置文件 1) 备份Samba的配置文件:cp /etc/samba/smb.conf /etc/samba/smb.conf.bak ...
- C语言与java 20155317 王新玮第二次
20155317 王新玮第二次写作感想 你有什么技能比大多数人(超过90%以上)更好? 刚刚看到这个题目,我的首先想到的是会一些中医,懂得中医的理论框架知识,懂得大部分的中医脉象,能够解决日常生活 ...
- 安卓手机USB网络共享,电脑卡顿、反应慢
1.首先需要把手机连接到电脑,在手机上打开USB网络共享. 2.打开设备管理器 3.在网络适配器中,找到Remote NDIS based Internet Sharing Device,右键更新驱动 ...
- MySql UDF 调用外部程序和系统命令
1.mysql利用mysqludf的一个mysql插件可以实现调用外部程序和系统命令 下载lib_mysqludf_sys程序:https://github.com/mysqludf/lib_mysq ...
- Learning Play! 2.4
1) Activator Download typesafe-activator-1.3.5.zip, extract, set path 2) Create new project activato ...
- 不同类型的指针+1之后增加的大小不同(a,&a的地址是一样的,但意思不一样)
main() { ]={,,,,}; ); printf(),*(ptr-)); } *(a+1)就是a[1],*(ptr-1)就是a[4], 执行结果是2, 5.&a+1不是首地址+1,系统 ...
- Java的书写格式,标识符及命名规则,注释
Java的书写格式,标识符及命名规则,注释 1.Java语言的书写格式(约定成俗) 1) 大括号要对齐(左大括号与句尾对其,后面大括号与句头对齐),并且成对写 2) 左大括号前面有空格 3) 遇到左大 ...
- c#之结构体
struct是一种复合值类型,通常用来封装小型变量组,其中每个变量为结构的成员. C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: ...
- ABP理论学习之领域服务
返回总目录 本篇目录 介绍 IDomainService接口和DomainService类 样例 创建一个接口 服务实现 调用应用服务 一些讨论 何不只使用应用服务 如何强制使用领域服务 介绍 领域服 ...
- UI控件(UIAlertController)
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIButton *_button = [UIBut ...