Linq语句的左、右、内连接

目前在进行项目中,数据的多表查询出现了一些问题,在查询数据时,如果该数据表中的外键不存在数据时,则该数据在页面中无法查询和显示.
例如:客户,客户可以关联供应商或业务员,也可以不关联;
但是不关联时,该客户就无法在客户查询中显示,但是该客户的数据在数据库中是存在的。

因为之前做的查询,数据在数据库表中的每个字段都是存在数据的,因此没有到过这类问题。
因为用的是Linq查询语句,经过思考后感觉可以用右连接或者左连接来解决这问题。

Linq的左、右、内连接

             //左链接  
            //tbClient 表为左 tbSupplier 表为右
            //希望获取tbClient 表中的所有数据,tbSupplier 表中不匹配的数据可为NULL
            var leftClient = from tbClient in myModels.S_Client //客户
                             join tbSupplier in myModels.S_Supplier on tbClient.SupplierID
                             equals tbSupplier.SupplierID into client //供应商
                             from tbSupplier in client.DefaultIfEmpty()
                              select new
                              {
                                  Sname = tbSupplier.SupplierName,
                                  Cname = tbClient.ClientName,
                              };
            //右链接  
            //tbSupplier 表为左  tbClient 表为左表为右
            //希望获取tbSupplier 表中的所有数据,tbClient 表中不匹配的数据可为NULL
            var rightClient = from tbSuplier in myModels.S_Supplier
                              join tbClient in myModels.S_Client on tbSuplier.ClientID
                              equals tbClient.ClientID into Suplier
                              from tbClient in Suplier.DefaultIfEmpty()
                              select new
                              {
                                  Sname = tbSuplier.SupplierName,
                                  Cname = tbClient.ClientName,
                              };
            //内连接
            var innerClient = from tbA in myModels.S_Client
                              join tbB in myModels.S_Employee on tbA.EmployeeID equals tbB.EmployeeID
                              select new
                              {
                                  Cname = tbA.ClientName,
                                  Aname = tbB.EmpName,
                              };
            //多个左连接(这里的select new 后面只显示其中几个查询字段)
			var listClientdate = from tbClient in myModels.S_Client //客户
                             join tbSupplier in myModels.S_Supplier on tbClient.SupplierID
                             equals tbSupplier.SupplierID into joinDeptEmp //供应商
                             join tbEmployee in myModels.S_Employee on tbClient.EmployeeID
                             equals tbEmployee.EmployeeID into joinDeptEmp1//业务员
                             join tbColl in myModels.B_Collection on tbClient.CollectionID
                             equals tbColl.CollectionID into joinDeptEmp2 //收款
                             join tblint in myModels.B_Lnitialreceipt on tbClient.LnitialreceiptID
                             equals tblint.LnitialreceiptID into joinDeptEmp3 //期初
                             //左连接
                             //例如:tbClient 表为左 tbSupplier 表为右
                             from tbSupplier in joinDeptEmp.DefaultIfEmpty()
                             from tbEmployee in joinDeptEmp1.DefaultIfEmpty()
                             from tbColl in joinDeptEmp2.DefaultIfEmpty()
                             from tblint in joinDeptEmp3.DefaultIfEmpty()
                             //倒叙排序   //orderby排序 descending倒叙 
                             orderby tbClient.ClientID descending   
                             select new 
                             {
                                 Aname = tbClient.ClientName,
                                 Bname = tbColl.CollAccount,
                                 Cname = tbEmployee.EmpName,
                                 Dname = tbSupplier.SupplierName
                             };

在网上查找到的Linq语句的左、右连接的信息大体相同,也有的认为Linq语句只有左连接,而没有右链接。
因为左右连接的代码几乎是一样的,只是把表的位置进行了互换。

其实Linq语句中的左、右连接的代码几乎是一样的,只是表的位置互换了,从而达到更改主表的查询效果。
就左连接来说,左表的数据是必须的必须是全部显示出来的,右表的数据是与左表的数据匹配上就显示,匹配不上数值就为空或null。
而右链接与左连接正好是相反的,所以通过左右表的互换,可以实现左、右连接的效果。

from tbClient in myModels.S_Client //客户
join tbSupplier in myModels.S_Supplier on tbClient.SupplierID
equals tbSupplier.SupplierID into client //供应商 
//into 后面的 是范围变量(如client)(自定义的)
from tbSupplier in client.DefaultIfEmpty()
 //from 后面的 也是范围变量 里面的字段继承与连接的表 
 //左右连接关键词DefaultIfEmpty 

最后我达到的效果:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值