Если кто-то сталкивался с этим вопросом и хотел бы, чтобы для этого был использован метод расширения, я создал один, используя тот же подход, что и другие ответы.Он имеет ту же сигнатуру, что и обычный метод расширения соединения.
public static IEnumerable<TResult> LeftJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer,
IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector,
Func<TOuter, TInner, TResult> resultSelector)
{
return outer
.GroupJoin(inner, outerKeySelector, innerKeySelector, (outerObj, inners) =>
new
{
outerObj,
inners= inners.DefaultIfEmpty()
})
.SelectMany(a => a.inners.Select(innerObj => resultSelector(a.outerObj, innerObj)));
}