目前在进行项目中,数据的多表查询出现了一些问题,在查询数据时,如果该数据表中的外键不存在数据时,则该数据在页面中无法查询和显示.
例如:客户,客户可以关联供应商或业务员,也可以不关联;
但是不关联时,该客户就无法在客户查询中显示,但是该客户的数据在数据库中是存在的。
因为之前做的查询,数据在数据库表中的每个字段都是存在数据的,因此没有到过这类问题。
因为用的是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
最后我达到的效果: