Some tips on how to do outer joins in LINQ
1.The introduction of joins in LINQ
https://stackoverflow.com/questions/36882478/how-to-do-sql-joins-in-lambda/36883214
2.Right outer join without Lambda
int[] arrayLeft = { 2, 3, 5, 6, 8 };
int[] arrayRight = { 9, 7, 6, 5, 3 };
// In theory LINQ only supports left outer join
// Swap the table sequence to do a right outer join with LINQ
var result = from r in arrayRight where r > 5
join l in arrayLeft on r equals l into joined
where r < 8
from j in joined.DefaultIfEmpty()
where j + r < 10
select new { Left = j, Right = r };
Console.WriteLine("After right outer joined in LINQ: ====");
foreach (var r in result)
Console.WriteLine(r);
//{ Left = 0, Right = 7 }
3.Right outer join with Lambda
int[] arrayLeft = { 2, 3, 5, 6, 8 };
int[] arrayRight = { 9, 7, 6, 5, 3 };
// Equivalent right outer join in LINQ with Lambda
var result = arrayRight.Where( r => r > 5 )
.GroupJoin(arrayLeft, outer => outer, inner => inner, (r, l) => new {Right = r, Left = l })
.Where( row => row.Right < 8 )
.SelectMany(toFlatten => toFlatten.Left.DefaultIfEmpty(), (row, flatterned) => new { Left = flatterned, Right = row.Right })
.Where(x => x.Left + x.Right < 10);
Console.WriteLine("After right outer joined with Lambda in LINQ: ====");
foreach (var r in result)
Console.WriteLine(r);
//{ Left = 0, Right = 7 }