mysql 查询 投影,MySql-连接查询

连接查询

Chloe 友好支持多表连接查询,一切都可以用 lambda 表达式操作,返回类型可以是自定义类型,也可以是匿名类型。强类型开发,编译可见错误,容错率高。

1.建立连接:

var user_city_province = context.Query()

.InnerJoin((user, city) => user.CityId == city.Id)

.InnerJoin((user, city, province) => city.ProvinceId == province.Id);

2.得到一个 IJoiningQuery 对象,就可以 Select 所需要的数据返回一个 IQuery 对象,然后就可以进行 Where、OrderBy、GroupBy、分页、聚合查询等操作:

查出一个用户及其隶属的城市和省份的所有信息:

/* 调用 Select 方法返回一个泛型为包含 User、City、Province 匿名类型的 IQuery 对象。

* Select 方法也可以返回自定义类型 。

*/

var qq = user_city_province.Select((user, city, province) => new

{

User = user,

City = city,

Province = province

});

/* 根据条件筛选,然后调用 ToList 就会返回一个泛型为 new { User = user, City = city, Province = province } 的 List 集合 */

var result = qq.Where(a => a.User.Id == 1).ToList();

/*

* 生成的 sql:

* SELECT `Users`.`Id` AS `Id`,`Users`.`Name` AS `Name`,`Users`.`Gender` AS `Gender`,`Users`.`Age` AS `Age`,`Users`.`CityId` AS `CityId`,`Users`.`OpTime` AS `OpTime`,`City`.`Id` AS `Id0`,`City`.`Name` AS `Name0`,`City`.`ProvinceId` AS `ProvinceId`,`Province`.`Id` AS `Id1`,`Province`.`Name` AS `Name1`

FROM `Users` AS `Users`

INNER JOIN `City` AS `City` ON `Users`.`CityId` = `City`.`Id`

INNER JOIN `Province` AS `Province` ON `City`.`ProvinceId` = `Province`.`Id`

WHERE `Users`.`Id` = 1

*/

/* 如果不想返回所有字段,得到 IQuery 对象后可以进一步 Select 指定的字段提高查询性能

* ##推荐使用此方式##

*/

var result1 = qq.Where(a => a.User.Id == 1)

.Select(a => new { UserId = a.User.Id, UserName = a.User.Name, CityName = a.City.Name, ProvinceName = a.Province.Name })

.ToList();

可以只获取指定的字段信息:

user_city_province.Select((user, city, province) => new

{

UserId = user.Id,

UserName = user.Name,

CityName = city.Name,

ProvinceName = province.Name

}).Where(a => a.UserId == 1).ToList();

/*

* 生成的 sql 只会包含 UserId、UserName、CityName、ProvinceName 四个字段

* SELECT `Users`.`Id` AS `UserId`,`Users`.`Name` AS `UserName`,`City`.`Name` AS `CityName`,`Province`.`Name` AS `ProvinceName`

FROM `Users` AS `Users`

INNER JOIN `City` AS `City` ON `Users`.`CityId` = `City`.`Id`

INNER JOIN `Province` AS `Province` ON `City`.`ProvinceId` = `Province`.`Id`

WHERE `Users`.`Id` = 1

*/

快捷连接

框架提供了快捷连接的接口:

context.JoinQuery((user, city, province) => new object[]

{

JoinType.LeftJoin, user.CityId == city.Id, /* 表 User 和 City 进行Left连接 */

JoinType.LeftJoin, city.ProvinceId == province.Id /* 表 City 和 Province 进行Left连接 */

})

.Select((user, city, province) => new { User = user, City = city, Province = province }) /* 投影成匿名对象 */

.Where(a => a.User.Id > -1) /* 进行条件过滤 */

.OrderByDesc(a => a.User.Age) /* 排序 */

.TakePage(1, 20) /* 分页 */

.ToList();

超过5个表连接

//假设已经有5个表建立了连接的对象为 jq_q1_q5

IJoiningQuery jq_q1_q5 = null;

//jq_q1_q5 调用 Select 方法,返回一个包含 T1-T5 的 IQuery 对象 view_q1_q5

var view_q1_q5 = jq_q1_q5.Select((t1, t2, t3, t4, t5) => new { T1 = t1, T2 = t2, T3 = t3, T4 = t4, T5 = t5 });

//假设第6个表的 IQuery 对象为 q6

IQuery q6 = null;

//这时,view_q1_q5 与 q6 建立连接,返回 IJoiningQuery 对象 jq

var jq = view_q1_q5.InnerJoin(q6, (t1_t5, t6) => t1_t5.T5.XX == t6.XXX);

//然后我们调用 jq 的 Select 方法,返回一个包含 T1-T6 的 IQuery 对象 view。

//view 又是一个 IQuery 对象,泛型参数为包含 T1-T6 所有信息的匿名对象(这时候还没有发起 sql 查询哦),拿到它,我们就可以为所欲为了。

var view = jq.Select((t1_t5, t6) => new { T1 = t1_t5.T1, T2 = t1_t5.T2, T3 = t1_t5.T3, T4 = t1_t5.T4, T5 = t1_t5.T5, T6 = t6 });

//可以直接查出数据库中 T1-T6 的所有信息

view.ToList();

//也可以选取 T1-T6 中我们想要的字段

view.Select(a => new { a.T1.xx, a.T2.xx, a.T3.xx /*...*/}).ToList();

框架亦支持左连接、右连接查询,用法和内连接相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 递归栏目名叠加,thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归...

thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归本文实例讲述了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法。分享给大家供大家参考,具体如下:这里使用thinkphp递归循环栏目按照树形结构无限极输出&#…

php cannot call constructor,安装ECshop普遍问题的解决方法

安装时的问题:1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /usr/local/httpd2/htdocs/upload/install/includes/lib_installer.php on line 31解决:找到install/includes/lib_installer.php中的…

wind试用版 matlab,免费产品试用 - MATLAB Simulink

请选择其一AlabamaAlaska美属萨摩亚APO/FPO AAAPO/FPO AEAPO/FPO APArizonaArkansasCaliforniaCaroline IslandsColoradoConnecticutDelawareDistrict of ColumbiaFlorida格鲁吉亚关岛HawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMariana Islands马绍尔群岛Mar…

php yii2 sns,GitHub - yggphpcoder/iisns: 基于 yii2 的 sns 社区系统,一站式解决社区建站...

iisns - 地球村入口iiSNS 是基于 yii2 的 SNS 社区系统,一站式解决社区建站。可以写文章,做记录,上传图片,论坛聊天等。还可以用来做内容管理系统(CMS)。iiSNS 是一个免费的开源项目,在 MIT 许可证下授权发布。特点与功…

php mvc 商城,基于MVC框架的小型网上商城设计

2.本人对课题任务书提出的任务要求及实现预期目标的可行性分析基于MVC框架的小型网上商城实现的功能:商品的浏览、查询、购买,会员注册以及会员订单的查询等,方便商场活动,该系统基本实现了网上商城的应有功能。该系统…

php 做更新进度条,PHP exec()后更新Bootstrap进度条

我使用PHP来运行一个python脚本,并且在脚本执行后需要更新一个进度条。进度条更新后,将执行另一个脚本,依此类推。这里是我的代码如此的票价。我试图用JavaScript来实现。它没有解决Button Textif (isset($_POST[turn])){exec("sudo pyt…

zblog php和asp功能,ZBlog是否适合PHP或ASP?我们该如何选择?

我最近玩了zblog一段时间,对于大多数第一次联系zblog的博客,他们会问zblog是否适合PHP或ASP?我们该如何选择?事实上,我真的不明白这个问题。我个人更喜欢PHP。今天我将整理出来并对PHP版本和ASP版本进行比较&#xff0…

php js记住密码功能,jquery.cookie.js实现用户登录保存密码功能的方法_jquery

本文实例讲述了jquery.cookie.js实现用户登录保存密码功能的方法。分享给大家供大家参考,具体如下:需要导入的js有jquery.js和jquery.cookie.js在页面加载时首先尝试获取cookie的值,如果cookie有值,则将获取到的值填入输入框中&am…

oracle dbf 超大,oracle 数据库users01.dbf文件过大 转移方法

如果出现 linux 拒绝错误,可以把目录权限 该为777由于在安装的时候将Oracle安装到了C盘,表空间也创建到了C盘(当时没有在意),等项目进行到了中期,发现C盘的空间不够用了。此时,一个较好的解决办法就是将表空间的文件转…

oracle中exists连接两个表,IN、EXISTS、多表连接,哪个速度更快

本帖最后由 ghsau 于 2011-10-11 23:39 编辑请看下面三个执行计划(Oracle10g)1. 用INSQL> select ename from emp e where e.deptno in (select d.deptno from dept d where d.dnameSALES);PLAN_TABLE_OUTPUT------------------------------------------------------------…

php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...

据了解,很多中大型企事业单位的IT基础结构具有复杂、分散等特征,并且信息化程度越高,数据类型越繁杂,数据量也越庞大。许多单位不得不付出极大的人力、物力对网络进行管理。而一个单位的信息化的程度和IT部门的服务水平&#xff0…

oracle迁移undo表空间,oracle切换undo表空间

Oracle里的回滚表空间在数据库使用一段时间后,undo表空间的dbf文件往往会增长到比较大,这个时候我们需要切换undo表空间1.新建undo表空间SQL> create undo tablespace undotbs2 datafile /data/undotbs02.dbf size 10M autoextend on next 10M ;2.由于…

pppoe linux 配置文件,linux PPPOE服务端配置

查看pppo服务器安装包pm -qa | grep pppoe 可以看到系统中pppoe server安装包rpm -ql rp-pppoe-3.5-2 查看该安装包安装信息(如安装路径,配置文件等),如果有信息输出,你可以看到这一行:/sbin/pppoe-serverps -e | grep pppoe-serve 查看pppoe服务有没有运行,如果没有,则启动: p…

设置linux拨号服务端,CentOS Linux上搭建PPPoE服务器及拨号设置

CentOS下PPPoE拨号设置1.查看并安装拨号软件:[rootRedHat ~]# rpm -qa|grep pppoe[rootredhat ~]# yum -y install rp-pppoerp-pppoe.i686 0:3.10-8.el62.查看adsl-setup命令所在位置:[rootredhat ~]#whereis adsl-setupadsl-setup:或者直接搜索pppoe信息…

Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

Linux操作系统网络编程--原始套接字 (1)http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM,SOCK_DRAGM).在这一章 里面我们一起来学习另外一种套接字--原始套接字(SOCK_RAW)。应用原始套接字,我们可以编写…

linux上pyenv卸载,在Ubuntu 18.04系统下安装pyenv的方法

本文介绍在Ubuntu 18.04操作系统下安装pyenv的方法,使用它可以进行Python多版本管理,目的是防止不同的Python版本因为不兼容而出现错误。安装pyenv其实非常的简单,只需要在系统终端中运行一条命令即可,以下是操作方法,…

linux防火墙作用是什么,Linux防火墙操作1

什么是防火墙防火墙可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。简单来讲 就是防止外界通过网络攻击Linux服务器的一个软件本次学习目标:防火墙的启停&#xff0…

linux中touch命令的作用,Linux中touch命令的作用是什么

今天微子网络向你展示了触摸命令在Linux中的功能。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。linux的Touch命令不常用,但在使用make时可能会用到,make用于修改文件时间戳或创建一个不存在的新文…

linux打jar包xml文件,springboot打jar包部署外置配置文件

一、读取配置文件的优先级默认:Jar包同级目录的config目录Jar包同级目录classPath(即resources目录)的config目录classpath目录最高优先级的方式是项目启动时通过命令的方式指定项目加载核心配置文件,命令如下java –jar xxxx.jar -Dspring.config.locat…

linux将视频导入到iphone,如何将 IPhone 的文件导入 Linux

如何将 IPhone 的文件导入 Linux完全免费方案。方法一: 使用 Koder 的 Local File Access 功能这方法不需要在 Linux 端做任何配置。IPhone 端安装 koder进入应用 Koder点击右下角的 Settings进入 Local File Access选择 Enable Local File Access你可以看到一个链接…