LinqMethod 实现 LeftJoin
2019-06-26 18:34
288 查看
LinqMethod 实现 LeftJoin
Intro
有时候我们想实现 leftJoin 但是 Linq 提供的 Join 相当于是
INNER JOIN,于是就打算实现一个
LeftJoin的扩展。
如果要使用到左连接,你需要使用 DefaultIfEmpty 来在没有join到数据的时候返回默认的集合
Solution
/// <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
相关文章推荐
- [转] LINQ Method cannot be translated into a store expression.
- Linq实现sql一张表数据不存在另外一张表
- LINQ实现递归算法
- 用linq实现登陆功能
- 工厂方法(Factory Method)模式的Java实现[00原创]
- 打印星号(*)三角形(C# Linq实现)的小例子
- 设计模式之C#实现(三)FactoryMethod
- linq to access 简单实现
- linq to access 简单实现 实例demo
- DMSLinq表达式框架实现(六)
- Linq中实现Left Join,Right Join
- 实现类似LINQ TO SQL的功能, 轻量级的数据访问组件
- LINQ Join & Group Join & Left Join 实现与区别
- Linq使用Lambda表达式实现某列去重
- linq 实现动态 orderby
- 比FastMethod更快的Java反射调用API,以及比Cglib更快的BeanMap实现
- Linq to Object实现分页获取数据
- 综合应用WPF/WCF/WF/LINQ之三十六:实现一个完全封装的SortableListView控件
- linq Distinct的一个简单实现方法
- .NET数据库编程求索之路--8.使用LinqToSQL实现