本系列目录

  1. CRL快速开发框架系列教程一(Code First数据表不需再关心)
  2. CRL快速开发框架系列教程二(基于Lambda表达式查询)
  3. CRL快速开发框架系列教程三(更新数据)
  4. CRL快速开发框架系列教程四(删除数据)
  5. CRL快速开发框架系列教程五(使用缓存)
  6. CRL快速开发框架系列教程六(分布式缓存解决方案)
  7. CRL快速开发框架系列教程七(使用事务)
  8. CRL快速开发框架系列教程八(使用CRL.Package)
  9. CRL快速开发框架系列教程九(导入/导出数据)
  10. CRL快速开发框架系列教程十(导出对象结构)
  11. CRL快速开发框架系列教程十一(大数据分库分表解决方案)
  12. CRL快速开发框架系列教程十二(MongoDB支持)
  13. 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表达式查询)的更多相关文章

  1. CRL快速开发框架系列教程十二(MongoDB支持)

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

  2. CRL快速开发框架系列教程十三(嵌套查询)

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

  3. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

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

  4. CRL快速开发框架系列教程十(导出对象结构)

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

  5. CRL快速开发框架系列教程九(导入/导出数据)

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

  6. CRL快速开发框架系列教程七(使用事务)

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

  7. CRL快速开发框架系列教程六(分布式缓存解决方案)

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

  8. CRL快速开发框架系列教程五(使用缓存)

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

  9. CRL快速开发框架系列教程三(更新数据)

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

随机推荐

  1. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  2. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  3. SQL Server内存遭遇操作系统进程压榨案例

    场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的 ...

  4. Android-armebi-v7a、arm64-v8a、armebi的坑

    先来一波扫盲: armeabi:针对普通的或旧的arm v5 cpu armeabi-v7a:针对有浮点运算或高级扩展功能的arm v7 cpu(32位ARM设备) arm64-v8a:64位ARM设 ...

  5. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  6. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  7. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  8. vue.js初探

    前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...

  9. 使用github远程仓库

    经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...

  10. Android SDK 与API版本对应关系

    Android SDK版本号 与 API Level 对应关系如下表: Code name Version API level   (no code name) 1.0 API level 1   ( ...