EasyFast开源框架下载链接:Download
EasyFast框架是一个快速开发框架,包含轻量级ORM模块、非DAL层事务解决方案(更轻松的用现有方法实现事务)、参数化查询解决方案、Web层MVC解决方案。
EasyFast说明文档
一、查询组件说明:
1、简介
EasyFast内置了非常灵活的查询方法,即可以拼字符串查询(速度快,安全性差),也可以参数化查询(速度较慢,安全性高)。查询条件可以用于CURD等任何操作,作为where方法的参数传入即可。
2、用法:
2.1、 拼字符串的方式较简单。相当于直接写where条件的sql语句。
//一个典型的查询例子
string where = "username like '%" + username + "%'";
//参数:要查询的字段,查询条件,排序字段
DataTable dtUser = bll.GetDataTable("*", where, "username");
2.2、 参数化查询要用到Condition对象。
Condition whereTxt = new Condition();
//相当于UserName='admin'
whereTxt.Add("UserName","admin");
//参数:要查询的字段,查询条件,排序字段
DataTable dtUser = bll.GetDataTable("*",whereTxt, "username");
2.3、表达式查询
表达式不区分大小写
表达式 |
含义 |
EQ |
等于(=) |
NEQ |
不等于(<>) |
GT |
大于(>) |
EGT |
大于等于(>=) |
LT |
小于(<) |
ELT |
小于等于(<=) |
LIKE |
模糊查询 |
[NOT] BETWEEN |
(不在)区间查询 |
[NOT] IN |
(不在)IN 查询 |
EXP |
表达式查询,支持SQL语法 |
示例如下:
EQ:等于(=)
Condition filter = new Condition();
filter.Add("id","eq",100);
表示的查询条件就是 id = 100
NEQ:不等于(<>)
Condition filter = new Condition();
filter.Add("id","neq",100);
表示的查询条件就是 id <> 100
GT:大于(>)
Condition filter = new Condition();
filter.Add("id","gt",100);
表示的查询条件就是 id > 100
EGT:大于等于(>=)
Condition filter = new Condition();
filter.Add("id","egt",100);
表示的查询条件就是 id >= 100
LT:小于(<)
Condition filter = new Condition();
filter.Add("id","lt",100);
表示的查询条件就是 id < 100
ELT:小于等于(<=)
Condition filter = new Condition();
filter.Add("id","elt",100);
表示的查询条件就是 id <= 100
[NOT] LIKE:同sql的LIKE
Condition filter = new Condition();
filter.Add("name","like","%张%");
表示的查询条件就是 name like ‘%张%’
[NOT] BETWEEN: 同sql的[NOT] BETWEEN
Condition filter = new Condition();
filter.Add("mdate","between","2012-9-8,2012-10-6");
表示的查询条件就是 mdate between 2012-9-8 and 2012-10-6
[NOT] IN: 同sql的[NOT] IN
Condition filter = new Condition();
filter.Add("id","in","1,2,3,4");
表示的查询条件就是 id in (1,2,3,4)
EXP: 自定义查询
filter.Add("id","in","1,2,3,4");
可以改成:
filter.Add("_exp","id in (1,2,3,4)");
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。
2.4、组合查询
Condition filter = new Condition();
filter.Add("id","in","1,2,3,4");
filter.Add("name","like","%张%");
最后的查询条件就是:id in (1,2,3,4) and name like ‘%张%’
组合查询中用“或(or)”的例子:
Condition filterOr = new Condition();
filterOr.Add("id","in","1,2,3,4");
filterOr.Add("name","like","%张%");
filterOr.Add("_logic","or");
Condition filter = new Condition();
filter.Add("description","like","%钓鱼岛%");
filter.Add("_complex", filterOr);
最后的查询条件就是:(id in (1,2,3,4) or name like ‘%张%’) and description like ‘%钓鱼岛%’
二、 事务组件说明:
1、 简介:
DAL中的每个添加、修改、删除数据的方法都支持EFTransaction,所以它可以复用已有的方法而不必在DAL中新增支持事务的方法。如果 使用EFTransaction,在每个方法运行时都只会提取每个方法中的sql语句和参数但不执行,最后在调用它的commit方法时批量执行。如果失 败将自动回滚。此对象最多可允许99条sql语句批量执行。
2、用法 一个典型的例子:
EFTransaction tran = new EFTransaction(); BLLA.Delete(ID, tran); BLLB.Delete(ID, tran); if (tran.Commit()) { ToShow("删除成功!", backUrl); }
3、其他方法:
当然你也可以直接用TransactionScope分布式事务,不过Oracle得装额外的组件,装了几次反正我没有安装成功过。
三、 DAL层说明:
1、DAL层简介:
DAL层使用反射+特性写的一个泛型类,只要把Model传入即可实现增删查改等大量的方法,程序员几乎可以不用写任何方法。与以前相比一个Model对应一个Dal类相比极大提高了效率和准确率。
大致实现原理如下: 先根据传入的Model反射出内部的属性数组,此时相当于获取了表中的每个字段,平时写的insert方法不就是insert into table (xxx) values(xxx),xxx用属性名称代替即可。其他方法类似。
2、 多表查询:
有两种多表查询的方法
第一:把视图(其实是sql语句)写在App_Data下ViewData.xml文件:
<ViewData> <Name>view</Name> <SQL> <![CDATA[ (select b.*,d.departmentname from businessdepartment b left join department d on b.businessdepartmentid=d.departmentid) as a ]]> </SQL> </ViewData>
Name是视图名称 SQL是拼视图的sql语句,sql语句外要加括号 如果是sqlserver还要加 “as 别名”,此方法对数据库依赖性小,性能稍差。
第二:直接在数据库中写视图。此方法对数据库依赖性大,性能稍高。
调用方法如下:
DataTable GetDataTable(string strTable, string what, string where, string orderby);
第一个参数指视图名称,如果传空则查询默认的Model对应的表。如果参数非空则先查xml文件中的视图 ,如果没有再查数据库中的视图。
一个使用视图的例子:
/// <summary> /// 检查是否可修改或删除 返回true 说明有关联数据不可删除 /// </summary> /// <param name="opercode"></param> /// <returns>返回true 说明有关联数据不可删除</returns> public bool CheckCanDeleteOrUpdate(string rescode) { BLL.Ucpermission bllUCPermit = new BLL.Ucpermission(); DataTable dtpermission = bllUCPermit.GetDataTable( "view_incpermission", "permitcode", "permitcode like 'add%' ", "permitcode"); return dtpermission.Rows.Count > 0; }
3、 多字段更新
调用如下方法:
public int UpdateForWhere(Hashtable keyValue, string where)
public int UpdateForWhere(Hashtable keyValue,Condition where)
keyValue参数存储更新的字段和更新的值。where是更新的条件。
使用示例:
//更新用户登陆信息 Hashtable userUpdate = new Hashtable(); userUpdate.Add("loginnum", modelUserInfo.loginnum + 1); userUpdate.Add("lastdate", DateTime.Now.ToLocalTime()); userUpdate.Add("lastip", LoginIP); BLL.Ucuser bll = new BLL.Ucuser(); bll.UpdateForWhere(userUpdate, "userid = 1");
4、 分页 有两个方法:
//获取总数
int total = bll.GetPaginationCount(Condition where);
//获取列表
DataTable GetPaginationData( string fieldNames, string orderby, Condition where, int startItem, int endItem)
当然还有返回IList<T>的重载方法,where查询条件也可以是字符串。
5、 其他方法GetModel、Delete、DeleteForWhere等方法比较简单,还有很多的重载方法,大家自己看吧。
6、 多数据库支持
其实此框架内置了MySQL、SQLServer、SQLite多数据的支持并留有接口用户可自行扩展,但是只是最轻量级的支持,不是说一个项目用 SQLServer写完了就可以顺利切换其他数据库。因为各个数据库的SQL语句写法可能不一样,比如TSQL的substring在PLSQL里就是 substr,所以程序中拼接的一些SQL字符串可能不能顺利移植。如果书写注意,修改量应该不算大。
数据库相关配置在Web.config中:
<connectionStrings> <!--mysql--> <add name="DataBase" connectionString="连接字符串"/> </connectionStrings> <appSettings> <!--可选项 SQLite MySQL SQLServer--> <add key="DataBaseType" value="SQLite"/> </appSettings>
如果修改数据库类型 上面两个地方需要同时修改。
四、 BLL层说明:
都继承BLL这个基类即可继承增删查改等方法。也可以写自定义方法。
例如:
public class Ucresource : BLL<Model.Ucresource> { /// <summary> /// 自定义方法 根据条件获取资源列表 /// </summary> /// <param name="whereTxt">查询条件</param> /// <returns>List<Model.Ucresource></returns> public List<Model.Ucresource> GetListByWhere(string where) { return GetList(null, where, " ResName ASC "); } }
五、 Model层说明:
此层较简单,写相关属性即可。例子:
public class Ucuser { /// <summary> /// 用户账号 /// </summary> [StrLen(6)] public string username { get; set; } }
说明:[StrLen(6)]特性指定属性值的长度,添加或修改方法会自动截断过长的赋值,防止报错。
这个Model还是属于贫血Model,大家可以自由扩展,如 表单提交时的自动验证、Code-First等功能。
六、 Web层说明:
Web层是自己开发的MVC。路由在WebConfig中配置,可用正则匹配。模板引擎是用Nvelocity效率较高。
具体说明:稍后会写 呵呵。
Web层有一个简易的权限Demo。URL输入http://ip:port即可自动路由至登录页面。 用户名admin 密码 123123 默认用SQLite数据库。
七、 结尾说明:
如果有报错可能是没有引用相关dll,dll都放在web层的dll目录中。另外sqlite可能会报只读错误,属性里改成可读写就行。