平时写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
};
如果对你有帮助,点赞支持一下,谢谢!