zoukankan      html  css  js  c++  java
  • LinqMethod 实现 LeftJoin

    LinqMethod 实现 LeftJoin

    Intro

    有时候我们想实现 leftJoin 但是 Linq 提供的 Join 相当于是 INNER JOIN,于是就打算实现一个 LeftJoin 的扩展。
    如果要使用到左连接,你需要使用 DefaultIfEmpty 来在没有join到数据的时候返回默认的集合

    Solution

    源代码:https://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Extensions/EnumerableExtension.cs#L149

    /// <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)));
    }
    

    Use

    使用起来和 Join 差不多,下面来展示一个示例

    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());
    

    输出:

    [{"PostId":1,"PostTitle":"12333","Tag":"HHH"},{"PostId":2,"PostTitle":"12333"}]
    

    Memo

    这是使用 LinqMethod 实现 LeftJoin,如果要使用 linq 查询语法实现左连接请参考这篇文章

    Reference

  • 相关阅读:
    动态生成java、动态编译、动态加载
    boostrap标签
    Java后端WebSocket的Tomcat实现
    编程过程与规范
    敏捷开发过程
    软件过程模型
    软件过程
    ISO9126 质量模型
    手机淘宝架构演化实践
    蒋勋:知识分子应具备怎样的美学修养
  • 原文地址:https://www.cnblogs.com/weihanli/p/11093097.html
Copyright © 2011-2022 走看看