CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
- CRL快速开发框架系列教程三(更新数据)
- CRL快速开发框架系列教程四(删除数据)
- CRL快速开发框架系列教程五(使用缓存)
- CRL快速开发框架系列教程六(分布式缓存解决方案)
- CRL快速开发框架系列教程七(使用事务)
- CRL快速开发框架系列教程八(使用CRL.Package)
- CRL快速开发框架系列教程九(导入/导出数据)
- CRL快速开发框架系列教程十(导出对象结构)
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
- CRL快速开发框架系列教程十二(MongoDB支持)
- CRL快速开发框架系列教程十三(嵌套查询)
正文
CRL采用Lambda表达式表示查询逻辑,表达式和拼串式的语法比较,优点如下
- 原生语法&运算符支持
基于Linq.Expressions语法方便好用 - 强类型检查编译
不用担心名字写错了,类型写错了,编译时IDE就会提示了 - 传参方便
例:b=>b.Id==1 参数直接写,统一处理后,也不用担心注入问题 - 与SQL函数基本等效的扩展方法
例:b=>b.Name.Substring(0,2)="22" 表示SQL SUBSTRING(name,0,2)
CRL对象管理基类是个抽象类,里面封装好了常用的方法,这意味着,不用再傻傻的去写什么FindOne,FindAll方法了
ORM只是CRL中的一部份功能,对象管理类是进一步封装,所以才有CRL.BaseProvider<T>
实现对象管理
public class ProductDataManage : CRL.BaseProvider<ProductData>
public static ProductDataManage Instance
{
get { return new ProductDataManage(); }
}
var instance = ProductDataManage.Instance;
直接用表达式查询
var item = instance.QueryItem(b => b.Id > 1);
var list = instance.QueryList(b => b.Id > 1);
创建完整查询语法
var query = instance.GetLambdaQuery();//创建查询
query.Top(100);//取多少条
query.Where(b => b.Id < 700);//查询条件
query.OrderBy(b => b.Id, true);//排序条件
var list = query.ToList();
如果要进行分页,则只需
query.Page(10, 1);//页大小,页索引
以上是返回当前对象,若要返回指定某些属性,可返回Dynamic类型
如GROUP查询
//using CRL以获取扩展方法
var query = instance.GetLambdaQuery();
query.Where(b => b.Id > 0);
query.Top(10);
//选择GROUP字段
query.Select(b => new
{
b.BarCode,
sum2 = b.SUM(x => x.Number * x.Id),//等效为 sum(Number*Id) as sum2
total = b.BarCode.COUNT(),//等效为count(BarCode) as total
sum1 = b.Number.SUM(),//等效为sum(Number) as sum1
b.ProductName
});
//GROUP条件
query.GroupBy(b => new { b.BarCode, b.ProductName });
//having
query.GroupHaving(b => b.Number.SUM() >= 0);
//设置排序
query.OrderBy(b => b.BarCode.Count(), true);//等效为 order by count(BarCode) desc
var list = query.ToDynamic();
进行简单关联查询
一般只返回选择的部份字段,调用Select方法,返回动态类型
//返回筛选值
var query = instance.GetLambdaQuery();
query.Top(10);
var member = new Code.Member();
member.Id = 11;
query.Join<Code.Member>((a, b) => a.UserId == member.Id && b.Id > 0,
CRL.LambdaQuery.JoinType.Left
).Select((a, b) => new { BarCode1 = a.BarCode, Name1 = b.Name,a.ProductName });
var list = query.ToDynamic();
如果要返回主表所有字段,和关联表部份字段呢,调用SelectAppendValue方法
此时返回主对象和内置索引值
//把关联值存入对象内部索引
//关联对象值都以索引方式存取
var query = instance.GetLambdaQuery();
query.Top(10);
query.Join<Code.Member>((a, b) => a.UserId == b.Id && b.Id > 0,
CRL.LambdaQuery.JoinType.Left
).SelectAppendValue(b => new { Name1 = b.Name });
var list = query.ToList();
foreach (var item in list)
{
var str = string.Format("{0}______{1}<br>", item.BarCode, item.Bag.Name1);//取名称为Name1的索引值
Response.Write(str);
}
如果有多次关联,再调用Join方法即可
通过这两种返回值方式,相信可以适应大部份场景了
扩展方法
为了实现SQL函数调用,用扩展方法代替表示
以下是CRL支持的扩展方法
//using CRL 以获取扩展方法
//对于一元运算,可按!=判断,如b.ProductName.Contains("122") 和!b.ProductName.Contains("122")
var query = instance.GetLambdaQuery();
query.Where(b => b.Id < b.Number);//直接比较可以解析通过
query.Where(b => b.ProductName.Contains("122"));//包含字符串
query.Where(b => !b.ProductName.Contains("122"));//不包含字符串
query.Where(b => b.ProductName.In("111", "222"));//string in
query.Where(b => b.AddTime.Between(DateTime.Now, DateTime.Now));//在时间段内
query.Where(b => b.AddTime.DateDiff(DatePart.dd, DateTime.Now) > 1);//时间比较
query.Where(b => b.ProductName.Substring(0, 3) == "222");//截取字符串
query.Where(b => b.Id.In(1, 2, 3));//in
query.Where(b => !b.Id.In(1, 2, 3));//not in
query.Where(b => b.UserId.Equals(Code.ProductChannel.其它));//按值等于,enum等于int
query.Where(b => b.ProductName.StartsWith("abc"));//开头值判断
query.Where(b => b.Id.Between(1, 10));//数字区间
query.Where(b => b.ProductName.Like("123"));// %like%
query.Where(b => b.ProductName.LikeLeft("123"));// %like
query.Where(b => b.ProductName.LikeRight("123"));// like%
query.Where(b => !string.IsNullOrEmpty(b.BarCode));
int LastDays = 30;
query.Where(b => b.AddTime.DateDiff(CRL.DatePart.dd, DateTime.Now) < LastDays);
一些转换函数也支持
query.Where(b => b.Id.ToString() == "123");//支持Cast转换
query.Where(b => Convert.ToString(b.Id) == "1");
等等...
关于结果返回
- 使用LambdaQuery完整查询调用Page方法就可以分页了,通过ToList和ToDynamic方法返回指定类型结果
- 当设置了关联,Group语法,也会按关联,Group语法解析
- 当调用了Select方法筛选字段,则需要根据实际情况返回结果类型
- 返回结果可以有以下几种类型
- List<dynamic> ToDynamic() 按筛选值返回动态类型
- List<TResult> ToList<TResult>() 按筛选值返回指定类型
- List<T> ToList() 直接返回当前类型
- Dictionary<TKey, TValue> ToDictionary<TKey, TValue>() 按筛选值返回字典(不支持分页)
打印查询
当是完整查询,调用query.PrintQuery()返回生成的查询语句和参数
如上关联查询打印出来为
[SQL]:select top 10 t1.[BarCode] as BarCode1,t2.[Name] as Name1,t1.[ProductName1] as ProductName from [ProductData] t1 with(nolock) Left join [Member] t2 with(nolock) on ((t1.[UserId]=@par0) AND (t2.[Id]>@par1))
[par0]:[11]
[par1]:[0]
CRL快速开发框架系列教程二(基于Lambda表达式查询)的更多相关文章
- 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快速开发框 ...
- 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快速开发框 ...
随机推荐
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 从中间件的历史来看移动App开发的未来
在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...
- SQL Server内存遭遇操作系统进程压榨案例
场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的 ...
- Android-armebi-v7a、arm64-v8a、armebi的坑
先来一波扫盲: armeabi:针对普通的或旧的arm v5 cpu armeabi-v7a:针对有浮点运算或高级扩展功能的arm v7 cpu(32位ARM设备) arm64-v8a:64位ARM设 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- Gradle 实现 Android 多渠道定制化打包
Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...
- 深入研究Visual studio 2017 RC新特性
在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...
- vue.js初探
前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...
- 使用github远程仓库
经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...
- Android SDK 与API版本对应关系
Android SDK版本号 与 API Level 对应关系如下表: Code name Version API level (no code name) 1.0 API level 1 ( ...