有时候咱们想实现 leftJoin 可是 Linq 提供的 Join 至关因而 INNER JOIN
,因而就打算实现一个 LeftJoin
的扩展。
若是要使用到左链接,你须要使用 DefaultIfEmpty 来在没有join到数据的时候返回默认的集合git
/// <summary> /// LeftJoin extension /// </summary> /// <typeparam name="TOuter">outer</typeparam> /// <typeparam name="TInner">inner</typeparam> /// <typeparam name="TKey">TKey</typeparam> /// <typeparam name="TResult">TResult</typeparam> /// <param name="outer">outer collection</param> /// <param name="inner">inner collection</param> /// <param name="outerKeySelector">outerKeySelector</param> /// <param name="innerKeySelector">innerKeySelector</param> /// <param name="resultSelector">resultSelector</param> /// <returns></returns> 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))); }
使用起来和 Join 差很少,下面来展现一个示例:post
var posts = new[] { new { PostId = 1, PostTitle = "12333", }, new { PostId = 2, PostTitle = "12333", }, }; var postTags = new[] { new { PostId = 1, Tag = "HHH" } }; var result = posts.LeftJoin(postTags, p => p.PostId, pt => pt.PostId, (p, pt) => new { p.PostId, p.PostTitle, pt?.Tag }).ToArray(); Console.WriteLine(result.ToJson());
输出:this
[{"PostId":1,"PostTitle":"12333","Tag":"HHH"},{"PostId":2,"PostTitle":"12333"}]
这是使用 LinqMethod 实现 LeftJoin,若是要使用 linq 查询语法实现左链接请参考这篇文章code