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

摘要:
本系列目录CRL快速开发框架系列教程I(无需关心CodeFirst数据表)CRL快速开发架构系列教程II(基于lambda表达式的查询)CRL快速发展框架系列教程III(更新数据)CRL快速发展框架系列教程IV(删除数据)CRL迅速发展框架系列指南V(使用缓存)CRL快速开发框架系列教程VI(分布式缓存解决方案)CRL快速开发框架7系列(使用事务)CRL快速发展框架8系列(使用CRL.Package

本系列目录

  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快速开发框架系列教程十三(嵌套查询)

 正文

像LINQ TO SQL一样,任意查询是众多ORM的终级梦想,一般做个关联查询就差不多了,再来嵌套查询,就很麻烦了

因为需要语法表达嵌套关系和筛选结果,一般基于Lambda表达式的ORM才能实现(拼串的就算了)

CRL4.2版本解决了匿名对象解析和子查询表达的问题,现在查询可以任意组合了
为了兼容以前的写法,增加了LambdaQuery.SelectV方法,返回LambdaQueryResultSelect类型
同时增加了以下几种方式

  • 关联子查询
    public LambdaQueryViewJoin<T, TJoinResult> Join<TJoinResult>(LambdaQueryResultSelect<TJoinResult> resultSelect, Expression<Func<T, TJoinResult, bool>> expression, JoinType joinType = JoinType.Inner) 
  • 联合查询
    public LambdaQueryResultSelect<TResult> Union<TResult2>(LambdaQueryResultSelect<TResult2> resultSelect, UnionType unionType = UnionType.UnionAll)
  • In,Exists查询也改为子查询形式
  • 返回多种结果
    public List<TResult> ToList()//返回匿名对象
    public List<TResult2> ToList<TResult2>()//返回指定类型
    public List<dynamic> ToDynamic()//返回动态类型

为了使子查询有关联性,需要调用CreateQuery方法创建查询
使用嵌套查询过程表示为:

主查询 => CreateQuery子查询 => 返回匿名对象筛选LambdaQueryResultSelect => 主查询嵌套子查询 => 返回结果

声明查询

var query = Code.ProductDataManage.Instance.GetLambdaQuery();
var query2 = query.CreateQuery<Code.Order>();

直接返回匿名结果

var result1 = query.SelectV(b => new { id = b.Id, name = b.CategoryName }).ToList();

SQL

select  t1.[Id] as id,t1.[CategoryName] as name  from [ProductData] t1  with(nolock) 

关联一个子查询

只要是LambdaQuery创建的语法都支持,如GROUP,DISTINCT,或者已经是一个关联查询

var viewJoin = query2.Where(b => b.Id > 10).SelectV(b => b);
var result2 = query.Join(viewJoin, (a, b) => a.UserId == b.UserId).Select((a, b) => new { a.CategoryName, b.OrderId }).ToList();

SQL

select  t1.[CategoryName] as CategoryName,t2.[OrderId] as OrderId  from [ProductData] t1  with(nolock)  
Inner join (select  t2.[Id],t2.[Status],t2.[OrderId],t2.[Remark],t2.[UserId],t2.[Channel],t2.[AddTime]  from [OrderProduct] t2  with(nolock)  where (t2.[Id]>@par0) ) t2
on (t1.[UserId]=t2.[UserId])

  

联合查询(支持N个)

var view1 = query.SelectV(b => new { a1 = b.Id, a2 = b.ProductName });
var view2 = query2.SelectV(b => new { a1 = b.Id, a2 = b.Remark });
var result3 = view1.Union(view2).OrderBy(b => b.a1).OrderBy(b => b.a2, false).ToList();

SQL:

select  t1.[Id] as a1,t1.[ProductName1] as a2  from [ProductData] t1  with(nolock)  
union all select t2.[Id] as a1,t2.[Remark] as a2 from [OrderProduct] t2 with(nolock) order by [a1] desc, [a2] asc

按In查询

var view = query2.Where(b => b.Name == "123").SelectV(b => b.Id);
query.In(view, b => b.UserId);
var sql2 = query.PrintQuery();

SQL:

select  t1.[Id],t1.[InterFaceUser],t1.[Date2],t1.[UserId],t1.[BarCode],t1.[TransType]
from [ProductData] t1  with(nolock)  where t1.[UserId] in(select  t2.[Id]  from [Member] t2  with(nolock)  where (t2.[Name]=@par0) ) 

来一个复杂的

var q1 = Code.OrderManage.Instance.GetLambdaQuery();
var q2 = q1.CreateQuery<Code.ProductData>();
q2.Where(b => b.Id > 0);
var view = q2.CreateQuery<Code.Member>().GroupBy(b => b.Name).Where(b => b.Id > 0).SelectV(b => new { b.Name, aa = b.Id.COUNT() });//GROUP查询
var view2 = q2.Join(view, (a, b) => a.CategoryName == b.Name).Select((a, b) => new { ss1 = a.UserId, ss2 = b.aa });//关联GROUP
q1.Join(view2, (a, b) => a.Id == b.ss1).Select((a, b) => new { a.Id, b.ss1 });//再关联
var result = view2.ToList();
var sql = q1.ToString();

SQL:

SELECT t1.[Id] AS Id,
       t2.[ss1] AS ss1
FROM [OrderProduct] t1 with(nolock)
INNER JOIN
  (SELECT t2.[UserId] AS ss1,
          t3.[aa] AS ss2
   FROM [ProductData] t2 with(nolock)
   INNER JOIN
     (SELECT t3.[Name] AS Name,
             COUNT(t3.Id) AS aa
      FROM [Member] t3 with(nolock)
      WHERE (t3.[Id]>@par1)
      GROUP BY t3.[Name]) t3 ON (t2.[CategoryName]=t3.[Name])
   WHERE (t2.[Id]>@par0) ) t2 ON (t1.[Id]=t2.[ss1])

  

免责声明:文章转载自《CRL快速开发框架系列教程十三(嵌套查询)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android Studio 多渠道打包(转)F5:健康检查配置指南(TCP+HTTP)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring Boot 连接MySql数据库

Spring Boot 以后也许会成为入门Spring的首选! 记一下Spring Boot 成功连接Mysql数据库的方法步骤! 一、新建Maven工程,不全Maven所需文件夹,在pom.xml引入SpringBoot的依赖包!可以参照:http://www.cnblogs.com/liangblog/p/5207855.html 二、有两种方法与数据...

django-rest-framework框架 第二篇 之Mixin扩展类

Mixin扩展类 ['列表操作','过滤','搜索','排序'] <一>:<1>创建项目: 配置 urls 主路由 配置model文件(举个例子,就以book为模型) 当完成这步时 进行数据的 ''迁移'' 然后 '执行' 操作 <2>在views中 导入通用视图类 (只要是用mixin就要导入通用视图类)导入...

一个超级简单的HTML模板框架源代码以及使用示例

HTML模板框架源代码 var HtmlTemplate = (function() { functionHtmlTemplate(htmlSource) { this.htmlSource =htmlSource; } HtmlTemplate.prototype.toHTML = function(params)...

Jupyter、Jupytext的安装使用教程

1.Jupyter的安装教程:https://jupyter.org/install.html 2.Jupyter的安装教程2:https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html 3.Jupytext安装使用教程:https://www.pianshen...

SQL 语句解析

查询语句 1.基础查询: SELECT * FROM 表 解析:此语句会将表中所有的字段查询出来,SQL执行的顺序:FROM 表 (找到表)=>SELECT *  (查询所有字段*代表所有字段) SELECT ID,NAME FROM 表 解析:此语句会将表中所有的字段查询出来,SQL执行的顺序:FROM 表 (找到表)=>SELECT  ...

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询、分页、排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用。Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询、分页、排序、复选框、设置显示列、Card...