Left Join 2 tables with main table using LINQ

Left Join 2 tables with main table using LINQ

这是我在 SQL 中的查询:

Select distinct * from tr.Table1 
Left Outer join tr.Table2 on tr.Table1.ID = tr.Table2.ID
Left Outer join tr.Table3 on tr.Table2.AId= tr.Table3.ID
where tr.Table1.Deleted =1 and tr.Table1.Ready=1 and tr.Table1.Show=0

查询在 SQL 中运行并给出了预期的 results.The 这里是我想要使用 LINQ 的等效项。我在 LINQ 查询中尝试了一些变体,例如:

var query = from p in _ctx.Table1
join s in _ctx.Table2 on p.Id equals s.Id into bag1
from to in bag1.DefaultIfEmpty()
join tx in _ctx.Table3 on to.AId equals tx.Id into bag2
from ts in bag2.DefaultIfEmpty()
select new
{
    ContactNo = to.Table1.ContactNo
};

但它总是不会 return 所有字段值。有些 return 编辑为 NULL。还尝试参考其他一些 link,但他们都专注于与父 table 的连接,而我必须将其中一个连接的 table 与另一个连接。所以我在这里,为此苦苦挣扎。

这是我目前得到的输出。某些值为空。该字段有值,但由于某些连接问题,它们被 return 编辑为 NULL

在此表示感谢。谢谢。

你的查询对我来说看起来很好,你必须得到 Nulls 的原因是因为当我们使用 DefaultIfEmpty 时,它 returns 对于不匹配的行为 null,因此您需要在获取实际结果时处理它。尝试做这样的事情:-

var query = from p in _ctx.Table1
join s in _ctx.Table2 on p.Id equals s.Id into bag1
from to in bag1.DefaultIfEmpty()
join tx in _ctx.Table3 on to.AId equals tx.Id into bag2
from ts in bag2.DefaultIfEmpty()
select new
{
    ContactNo = to == null ? String.Empty  : to.Table1.ContactNo
};

假设,ContactNo 是字符串类型,我已经使用了String.Empty你可以使用任何默认值。