var list = from a in context.Set<Table1>()
join b in context.Set<Table2>()
on a.Id equals b.Id into ab
from abi in ab.DefaultIfEmpty()
join c in context.Set<Table3>()
on a.SubId equals c.Id into ac
from aci in ac.DefaultIfEmpty()
where a.IsValid
select new OutXXXDto()
{
Barcode = abi.Barcode,
CustomerName = abi.CustomerName,
HandlingTime = a.HandlingTime.ToString("yyyy-MM-dd hh:mm:ss"),
Products = aci == null ? string.Empty : string.Join(",", aci.Sublist.Where(p => p.IsValid && p.Id.Equals(aci.Id)).Select(p => p.ProductName)),
SubBarcode = aci == null ? string.Empty : aci.Barcode,
};