CRL快速开发框架升级到3.1

时间:2022-06-27 20:56:15

CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为

  1. 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性)
  2. 无需第三方工具生成代理类,标准对象结构即可
  3. 基于Linq.Expression语法解析,完全对象化操作
  4. 支持join,group等语法和函数扩展方法
  5. 多种结果类型返回,对象,自定义对象,泛类型,字典等
  6. 多种数据库,多库支持
  7. 可封装继承的结构,充分使用面向对象的特性

在3.0大版本,增加了上手示例CRLShoppingDemo 供参考,同时自带的开发文档也在同步更新

最新版由于方法和结构有所更改,升级到3.1

到目前为止,常用查询语法和函数方法已经解析完成,支持功能表现在:

  • Join 多表关联查询
  • Sum,Count,Max,Min函数统计
  • 单表Group,Distinct
  • 查询字段筛选,支持别名
  • 可为空属性类型Nullable
  • 支持虚拟字段
  • 基本逻辑判断语法和扩展函数方法
  • 多表字段排序
  • 多种结果类型返回
  • 任意查询分页

3.1主要优化内容

  1. 优化查询语法,统一了结果返回方法
  2. 增强了表结构检查,后台线程会强制检查对像与表结构一致性

更新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:表结构强制检查

关于数据表创建缓存依赖

  1. CRL会自动创建对象对应的表结构,并初始
  2. CRL判断该不该创建对象对应的数据表,是由表缓存文件来判断,缓存文件路径/config/TableCache.config
  3. 系统运行时检查目录内有没有缓存,有则加载,没有则创建,在CRL内部检测表创建方法内,根据此缓存来判断,不存在表缓存,则创建表并保存缓存值
  4. 新增的对象,此时缓存内是没有的,则会创建数据表
  5. 在缓存结构和数据表结构一致的情况下,新增对象属性时,会自动创建数据表列
  6. 缓存文件和数据库实际表结构在一些情况下可能不一致,则需要手动干预
  • 当数据库有表,但字段不全,也没有缓存文件,CRL创建缓存文件时会按对象完整的结构缓存,此时缓存的表结构和数据库结构就不一致
  • 当缓存内有表,数据库没有表,CRL没法判断,不会自动创建表
  • 当缓存内表有所有表字段结构,数据库表字段被手动删掉,此时结构不一致
  • 当缓存文件被其它数据源生成的缓存文件覆盖了,可能产生结构不一致

由于以上问题,可能会导至找不到字段或表的错误,当前版本作了完善,于是在后台单独开启了一个线程,用以检查表结构,在对象被首次访问后,就会添加到结构检查队列,由后台异步进行处理

在程序运行后,每个被访问过的对象会被检查一次结构,达到结构同步的目的

源码请入群获取,密语CRL

源码结构:

CRL3.0=>

  CRLShoppingDemo------------->在线购物示例项目

  Core.Mvc------------------------->MVC简单封装

  CRL------------------------------->CRL主框架

  CRL.Package--------------------->CRL业务封装

  RoleControl---------------------->基于CRL实现的通用权限系统

  WebTest------------------------->开发&测试文档

历史升级导读

CRL快速开发框架升级到3.1的更多相关文章

  1. 非关系型数据库来了&comma;CRL快速开发框架升级到版本4

    *?,我很任性,我要造不一样的*,同时支持关系型和非关系型的框架有没有 新版数据查询作了些调整,抽象了LabmdaQueryy和DBExtend,升级到版本4,非关系数据库MongoDB被支持了! ...

  2. CRL快速开发框架升级到4&period;52&comma;谈谈开发过程中的优化

    CRL4.5版本已经稳定使用于目前的几个中型项目中,在实际使用中,也发现了不少问题,这些问题都在4.52中提交 CRL具体功能和使用请浏览 CRL快速开发框架系列教程 由于现在项目是一套业务系统,查询 ...

  3. CRL快速开发框架开源完全转到Github

    CRL简介 CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性) 无需第三方工 ...

  4. CRL快速开发框架系列教程十三&lpar;嵌套查询&rpar;

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. CRL快速开发框架系列教程十二&lpar;MongoDB支持&rpar;

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. CRL快速开发框架系列教程十一&lpar;大数据分库分表解决方案&rpar;

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. CRL快速开发框架系列教程十&lpar;导出对象结构&rpar;

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. CRL快速开发框架系列教程九&lpar;导入&sol;导出数据&rpar;

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. CRL快速开发框架系列教程七&lpar;使用事务&rpar;

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. 【性能为王】从PHP源码剖析array&lowbar;keys和array&lowbar;unique

    之前在[译]更快的方式实现PHP数组去重这篇文章里讨论了使用array_flip后再调用array_keys函数替换直接调用array_unique函数实现数组去重性能较好.由于原文没有给出源码分析和 ...

  2. &lbrack;转&rsqb;c&num;截取指定长度的字符串

    /// <summary> /// 截取指定長度的字符串 /// </summary> /// <param name="s"></par ...

  3. storm的特性

    storm的特性 Storm 是一个开源的分布式实时计算系统,可以简单.可靠地处理大量的数据流. Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个 ...

  4. Int16 Int32 Int64

    数据类型占多大空间 Int16, 等于short, 占2个字节. -32768 32767 Int32, 等于int, 占4个字节. -2147483648 2147483647 Int64, 等于l ...

  5. Uva 10652 Board Wrapping&lpar;计算几何之凸包&plus;点旋转&rpar;

    题目大意:给出平面上许多矩形的中心点和倾斜角度,计算这些矩形面积占这个矩形点形成的最大凸包的面积比. 算法:GRAHAM,ANDREW. 题目非常的简单,就是裸的凸包 + 点旋转.这题自己不会的地方就 ...

  6. C&num;中子线程操作主线程中窗体上控件的方法

    Demo this.listView1.Visible = true; this.listView1.BeginUpdate();this.listView1.EndUpdate(); //结束数据处 ...

  7. &lbrack;代码&rsqb;--db2中left&lpar;&rpar;函数和right&lpar;&rpar;函数对应oracle中的substr&lpar;&rpar;函数

     DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHA ...

  8. Fiddler过滤指定域名

    Fiddler过滤指定域名的方法一 切换到fiddler右侧窗口的Filters选项卡,勾选顶部的“Use Filters”,找到Hosts区域,设置以下三个选项: 1.第一项有三个选项,不做更改: ...

  9. 易语言中锐浪报表绿色发布指南&lpar;免COM组件DLL注册&rpar;

    第一步 打开易语言开发环境(注要求易语言版本 v5.5及以上版本,如果版本太低,请更新到新版本),点击[工具]菜单,进入系统配置界面: 第二步 切换选择夹到[存根]项目,选中"使用用户自定义 ...

  10. 除法保留小数bit位 &plus; 四舍五入

    /*num1/num2 保留bit 位小数 , 四舍五入*/ #include<bits/stdc++.h> using namespace std; ]; int main() { in ...