本系列目录

  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. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  3. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  4. console的高级使用

    1.console.table()用来表格化展示数据. var people = { zqz: { name: 'zhaoqize', age: 'guess?' }, wdx: { name: 'w ...

  5. 立即执行函数表达式(IIFE)

    原文地址:benalman.com/news/2010/11/immediately-invoked-function-expression/ 译者:nzbin 也许你还没有注意到,我是一个对术语比较 ...

  6. Angular企业级开发(4)-ngResource和REST介绍

    一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来 ...

  7. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

  8. PHP 设计模式概述

    一.设计模式(Design pattern)是什么? 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  9. Set up VLAN (802.1q) tagging on a network interface?

    SOLUTION VERIFIED October 13 2015 KB39674 KB741413 environment Red Hat Enterprise Linux 4 Red Hat En ...

  10. linux字符串url编码与解码

    编码的两种方式 echo '手机' | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g' echo '手机' |tr -d '\n' |od -An -tx ...