SQL的left join左连接查询转Linq

平时写sql比较多,某些脚本一到C#里面就不知道怎么转了。

本来开发时有一个左连接的脚本,比较复杂,为了笔记效果,所以将脚本做一个简化。

本来库里有两个表TableA和TableB,两个表的主键做如下关联:

--TableA的主键ID为TableB的外键Aid
SELECT ta.Id, ta.Name, tb.Id, tb.Name, tb.Aid, tb.IsDelete
FROM TableA ta
JOIN TableB tb ON ta.Id=tb.Aid

 

为了查询所有TableA及TableB的数据,但是当TableB中数据为空或IsDelete=0时,需要能看所有TableA的数据,所以使用左连接。脚本如下:

--TableA的主键ID为TableB的外键Aid
SELECT ta.Id, ta.Name, tb.Id, tb.Name, tb.Aid, tb.IsDelete
FROM TableA ta
JOIN TableB tb ON ta.Id=tb.Aid
WHERE (tb.Id IS NULL OR tb.IsDelete=0)

需要将上述的SQL转为Linq。
由于Linq中的左连接不能单独判断左联表的一个字段,所以Linq不能是如下写法:

var list = from a in TableA
           join b in TableB on a.Id equals b.Kid into tmp
           from t in tmp.DefaultIfEmpty()
           where (t.Id == null || t.IsDelete == false)
           select new
           {
               AID=ta.Id, 
               AName = ta.Name, 
               BID = tb.Id, 
               BName = tb.Name, 
               tb.IsDelete
           };


由于b表本身可能查询出空的数据,这个时候去取t.Id就会报错,因此正确的方法是:

var list = from a in TableA
           join b in TableB on a.Id equals b.Kid into tmp
           from t in tmp.DefaultIfEmpty()
           where (t == null || (t != null && t.IsDelete == false))
           select new
           {
               AID = ta.Id, 
               AName = ta.Name, 
               BID = tb.Id, 
               BName = tb.Name, 
               tb.IsDelete
           };

           
如果对你有帮助,点赞支持一下,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

willgon123

谢谢打赏,我将再接再厉!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值