CRL快速开发框架升级到3.1
CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为
- 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性)
- 无需第三方工具生成代理类,标准对象结构即可
- 基于Linq.Expression语法解析,完全对象化操作
- 支持join,group等语法和函数扩展方法
- 多种结果类型返回,对象,自定义对象,泛类型,字典等
- 多种数据库,多库支持
- 可封装继承的结构,充分使用面向对象的特性
在3.0大版本,增加了上手示例CRLShoppingDemo 供参考,同时自带的开发文档也在同步更新
最新版由于方法和结构有所更改,升级到3.1
到目前为止,常用查询语法和函数方法已经解析完成,支持功能表现在:
- Join 多表关联查询
- Sum,Count,Max,Min函数统计
- 单表Group,Distinct
- 查询字段筛选,支持别名
- 可为空属性类型Nullable
- 支持虚拟字段
- 基本逻辑判断语法和扩展函数方法
- 多表字段排序
- 多种结果类型返回
- 任意查询分页
3.1主要优化内容
- 优化查询语法,统一了结果返回方法
- 增强了表结构检查,后台线程会强制检查对像与表结构一致性
更新1:语法查询优化
语法查询优化表现在以下几个方面
- 字段间二元运算
query.Select(b => new {aa = b.Id * b.Number })//选择字段时二元运算
query.Where(b => b.Id < b.Id * b.Number)//条件选择时二元运算 - 表达式不区分左右
query.Where(b => 10 > b.Id);和query.Where(b => b.Id < 10 ); 等效 - 一元运算支持
query.Where(b => !b.IsTop)//等效为 isTop!=1 目前只处理了BOOL类型
query.Where(b => !b.ProductName.Contains("122"))//BOOL类型的扩展方法同样支持 - 关联查询支持以上所有特性
query.Join<Code.Member>((a, b) => a.UserId == b.Id && a.Id == c).Select((a, b) => new { a.BarCode, Year2 = b.Year * b.Id });
关联查询支持关联表排序 query.OrderBy<Code.Member>(b => b.Name, true) - 多列排序,只需调用OrderBy方法多次
query.OrderBy(b => b.Id, true);//按ID倒序
query.OrderBy(b => b.Name, false)//按Name正序
结果等效为 order by Id desc,Name asc
查询方法修改
- 使用LambdaQuery完整查询调用Page方法就可以分页了,通过ToList和ToDynamic方法返回指定类型结果
- 当设置了关联,Group语法,也会按关联,Group语法解析
- 当调用了Select方法筛选字段,则需要根据实际情况返回结果类型
- 返回结果可以有以下几种类型
- List<dynamic> ToDynamic() 按筛选值返回动态类型
- List<TResult> ToList<TResult>() 按筛选值返回指定类型
- List<T> ToList() 直接返回当前类型
- Dictionary<TKey, TValue> ToDictionary<TKey, TValue>() 按筛选值返回字典(不支持分页)
示例
代码1(实现Group查询)
- //Group查询
- var query = Code.ProductDataManage.Instance.GetLambdaQuery();
- query.Select(b => new { b.BarCode, total = b.BarCode.COUNT() });
- query.Where(b => b.Id > );
- query.GroupBy(b => new { b.BarCode });
- query.OrderBy(b => b.BarCode.COUNT(), true);//Group需要设置排序
- query.Page(,);//如果要分页,设定分页参数就行了
- var list = query.ToDynamic();
- int total = query.RowCount;
输出
- select t1.BarCode,COUNT(t1.BarCode) as total from [ProductData] t1 with(nolock) where (t1.Id>@parame0) group by t1.BarCode order by COUNT(t1.BarCode) desc
- [parame0]:[]
代码2(实现关联查询)
- //关联查询
- var query = Code.ProductDataManage.Instance.GetLambdaQuery();
- query.Where(b => b.Id > );
- query.Join<Code.Member>((a, b) => a.UserId == b.Id).Select((a, b) => new { a.BarCode, b.Name });
- query.Page(,);//如果要分页,设定分页参数就行了
- var list = query.ToDynamic();
- int total = query.RowCount;
输出
- select t1.BarCode,t2.Name from [ProductData] t1 with(nolock) Inner join Member t2 with(nolock) on (t1.UserId=t2.Id) where (t1.Id>@parame0)
- [parame0]:[]
代码3(实现关联再Group)
- //关联再Group查询
- var query = Code.ProductDataManage.Instance.GetLambdaQuery();
- query.Where(b => b.Id > );
- query.Join<Code.Member>((a, b) => a.UserId == b.Id).GroupBy((a, b) => new { a.BarCode, b.Name }).Select((a, b) => new { a.BarCode, b.Name });
- query.OrderBy(b=>b.BarCode);
- query.Page(,);//如果要分页,设定分页参数就行了
- var list = query.ToDynamic();
- int total = query.RowCount;
输出
- select t1.BarCode,t2.Name from [ProductData] t1 with(nolock) Inner join Member t2 with(nolock) on (t1.UserId=t2.Id) where (t1.Id>@parame0) group by t1.BarCode,t2.Name order by t1.BarCode desc
- [parame0]:[]
代码4(实现多次关联)
- //多表关联查询
- var query = Code.ProductDataManage.Instance.GetLambdaQuery();
- query.Where(b => b.Id > );
- query.Join<Code.Member>((a, b) => a.UserId == b.Id).Select((a, b) => new { a.ProductName, b.Name });//筛选返回的字段
- query.Join<Code.Order>((a, b) => a.UserId == b.UserId).Select((a, b) => new { orderid = b.OrderId });//筛选返回的字段
- query.OrderBy(b=>b.BarCode);
- query.Page(,);//如果要分页,设定分页参数就行了
- var list = query.ToDynamic();
- int total = query.RowCount;
输出
- select t1.ProductName,t2.Name,t3.OrderId as orderid from [ProductData] t1 with(nolock) Inner join Member t2 with(nolock) on (t1.UserId=t2.Id) Inner join OrderProduct t3 with(nolock) on (t1.UserId=t3.UserId) where (t1.Id>@parame0) order by t1.BarCode desc
- [parame0]:[]
- 对于一个查询,只需调用query.Page()方法就能轻易实现分页
- 如果需要把动态类型结果转换成定义好的对象,只需调用query.ToList<ClassName>()方法
- 业务类中不再提供使用完整LambdaQuery作为参数的方法返回数据,而直接使用LambdaQuery的子方法返回数据,如上所示
关于分页
- 设定分页参数后,CRL会生成对应数据库分页语法,如MSSQL采用ROWNUM分页
- 分页默认是编译为存储过程,如果数据库不支持自动编译,由以语句的形式查询
- 默认分页和Group分页为两种处理方式
更新2:表结构强制检查
关于数据表创建缓存依赖
- CRL会自动创建对象对应的表结构,并初始
- CRL判断该不该创建对象对应的数据表,是由表缓存文件来判断,缓存文件路径/config/TableCache.config
- 系统运行时检查目录内有没有缓存,有则加载,没有则创建,在CRL内部检测表创建方法内,根据此缓存来判断,不存在表缓存,则创建表并保存缓存值
- 新增的对象,此时缓存内是没有的,则会创建数据表
- 在缓存结构和数据表结构一致的情况下,新增对象属性时,会自动创建数据表列
- 缓存文件和数据库实际表结构在一些情况下可能不一致,则需要手动干预
- 当数据库有表,但字段不全,也没有缓存文件,CRL创建缓存文件时会按对象完整的结构缓存,此时缓存的表结构和数据库结构就不一致
- 当缓存内有表,数据库没有表,CRL没法判断,不会自动创建表
- 当缓存内表有所有表字段结构,数据库表字段被手动删掉,此时结构不一致
- 当缓存文件被其它数据源生成的缓存文件覆盖了,可能产生结构不一致
由于以上问题,可能会导至找不到字段或表的错误,当前版本作了完善,于是在后台单独开启了一个线程,用以检查表结构,在对象被首次访问后,就会添加到结构检查队列,由后台异步进行处理
在程序运行后,每个被访问过的对象会被检查一次结构,达到结构同步的目的
源码请入群获取,密语CRL
源码结构:
CRL3.0=>
CRLShoppingDemo------------->在线购物示例项目
Core.Mvc------------------------->MVC简单封装
CRL------------------------------->CRL主框架
CRL.Package--------------------->CRL业务封装
RoleControl---------------------->基于CRL实现的通用权限系统
WebTest------------------------->开发&测试文档
历史升级导读
CRL快速开发框架升级到3.1的更多相关文章
- 非关系型数据库来了,CRL快速开发框架升级到版本4
轮子?,我很任性,我要造不一样的轮子,同时支持关系型和非关系型的框架有没有 新版数据查询作了些调整,抽象了LabmdaQueryy和DBExtend,升级到版本4,非关系数据库MongoDB被支持了! ...
- CRL快速开发框架升级到4.52,谈谈开发过程中的优化
CRL4.5版本已经稳定使用于目前的几个中型项目中,在实际使用中,也发现了不少问题,这些问题都在4.52中提交 CRL具体功能和使用请浏览 CRL快速开发框架系列教程 由于现在项目是一套业务系统,查询 ...
- CRL快速开发框架开源完全转到Github
CRL简介 CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性) 无需第三方工 ...
- CRL快速开发框架系列教程十三(嵌套查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
随机推荐
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- [APUE]文件和目录(中)
一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- 十分钟玩转 jQuery、实例大全
一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...
- Java之多态(二)
package test05;import test06.Car1;public class DuoTai_Test02 { /**多个对象,一个形态 * Tiger.Lion.Snake → Ani ...
- JavaScript 写计算器改进版
<html><head><style> .short{height:50px;width:55px;float:left;}</style></h ...
- Struts2.5需要的最少jar文件
以Struts2.5.2为例 从官网上下载“struts-2.5.2-min-lib.zip”,里面有7个jar文件: commons-fileupload-1.3.2.jarcommons-io-2 ...
- NYOJ 998
这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...