title: linq左连接
date: 2021-12-05 08:45:48
tags: C# Linq
LINQ语言继承查询
近日项目实践中遇到这样的一个事情。在一个项目需求里存在这么一个情况,有以下一个主表与几个基础数据表组成一个大表,要求主表中的有的数据必须展示出来,但大表(即主表与基础数据表组成的表中存在部分数据项为空的情况)通常:连接多表进行查询的时候,使用join a inb.mid equals b.mid
SQL server数据表查询
# 使用全连接的方式(查询出的结果,只有两个表都匹配的结果)
select * from S_FlightDetails #查询主表中的所有数据图一
select * from S_FlightDetails as flight,S_FlightTransit as transit
where flight.FlightDetailsID = transit.FlightDetailsID #条件查询的大表数据,图二
# sql servers 全内连接,结果如图二
select *
from S_FlightDetails as flight inner join S_FlightTransit as transit on transit.FlightDetailsID = flight.FlightDetailsID
# sql servers 左连接,结果如图三
select *
from S_FlightDetails as flight left join S_FlightTransit as transit on transit.FlightDetailsID = flight.FlightDetailsID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNcmOkmy-1638927901542)(D:\Blog\source_posts\linq左连接\image-20211208082557063.png)]
图一sql servers 查询主表所有数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKA7SO7S-1638927901542)(D:\Blog\source_posts\linq左连接\image-20211208082414882.png)]
图二sql 条件查询及全内连接查询结果。两张表进行数据匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HIAiD1PU-1638927901543)(D:\Blog\source_posts\linq左连接\image-20211208083744160.png)]
图三sql左连接查询结果,不过如何主表中有的数据一定有,不管右表的数据是否存在
LiNQ左连接查询
在数据库中的sql server可以使用左连接来实现我所需要的结果,那么在项目中的使用LINQ进行左连接也能实现该效果。
// Program.cs 引用命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
//主查讯方法
public static void Main(string[] args){list<FlightVo> =(from a in model.FlightDeailsjoin b in model.FlightTransit on a.FlightDetailsID equals b.FlightDetailsIDselect new FlightVo{//略};)
}
使用该方法等同于sql server 中的全内连接
LINQ中没有直接以Left join
的方式实现左连接的,而是使用DefaultIfEmpty
空默认。如果该表中的数据没有数据返回空
public ActionResult QureFlight(){List<FlightVo> listFlight = (from tbFlightDetails in myModels.S_FlightDetailsjoin tbFlightTransit in myModels.S_FlightTransit.DefaultIfEmpty() on tbFlightDetails.FlightDetailsID equals tbFlightTransit.FlightDetailsIDselect tbFlightDetails).toList();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEh0FsI7-1638927901546)(D:\Blog\source_posts\linq左连接\image-20211208091411223.png)]
使用DefaultIfEmpty
的方式,判断表中数据是否为空。实现效果如sql server中的左连接查询。
总结
在一些复杂情况下,数据库中的数据并不全然相对,存在主表中存在相关数据,而副表中并没有有关数据的情况。这是往往需要以某个表为主,即便副表中没有存在相关数据也要将所有的数据进行展示时往往需要全部的数据,这是以某一张表为主的表,以该表为主向左或右连接,sql中用到左连接或是右连接。在LINQ中,忽略左右,更为直观。存在显示不存在不显示。