Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦
一:背景
1. 讲故事
前几天看同事在用 linq 给内存中的两个 model 做左连接,用过的朋友都知道,你一定少不了一个叫做 DefaultIfEmpty 函数,这玩意吧,本来很流畅的 from...in...join, 突然搞进来这么一个函数,真的是恶心他妈给恶心开门,恶心到家了,简化后的代码如下:
class User
{
public int UserID { get; set; }
public string Email { get; set; }
}
class Order
{
public int OrderID { get; set; }
public string OrderTitle { get; set; }
public int UserID { get; set; }
}
static void Main(string[] args)
{
var userList = new List<User>()
{
new User(){ UserID=1, Email="333@qq.com"},
new User(){ UserID=2, Email="444@qq.com"},
};
var orderList = new List<Order>()
{
new Order(){ OrderID=1, OrderTitle="订单1", UserID=1},
new Order(){ OrderID=2, OrderTitle="订单2", UserID=1}
};
var query = from u in userList
join o in orderList on u.UserID equals o.UserID into grp
from item in grp.DefaultIfEmpty()
select new { UserID = u.UserID, OrderTitle = item?.OrderTitle };
}

之所以出现这个情况是因为不管是 查询关键词 还是 扩展方法,都并没有直接对 leftjoin 和 rightjoin 底层支持,只能通过变通的方式去实现,这就很尴尬了,比如说上面的这段代码,你很难在多天之后还能准确理解这里的 DefaultIfEmpty 是用来干嘛的,那现在问题的关键在于,有没有什么方法让底层支持或者有可信的第三方帮我封装好,还真巧,在 github 上 还真有一个 morelinq 项目:https://github.com/morelinq/MoreLINQ,看 md 是给 Enumerable 扩展了 60,70 个方法,如虎添翼呀,接下来一起来探索下吧。
二: MoreLinq 下的探索
1. 安装
安装非常简单,用 nuget 跑一下 Install-Package morelinq -Version 3.3.2 即可。
2. LeftJoin / RightJoin / FullJoin
在 morelinq 中就提供了 左外,右边,全连接,这就很
Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦的更多相关文章
- 重写类的Equals以及重写Linq下的Distinct方法
当自定义一个类的时候,如果需要用到对比的功能,可以自己重写Equals方法,最整洁的方法是重写GetHashCode()方法. 但是,这个方法只适用于对象自身的对比(如if(a==b))以及字典下的C ...
- C#编程(六十一)------------LINQ中的扩展方法
原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...
- EF大数据批量处理 EntityFrameWork下增加扩展方法
为EF操作方法添加扩展方法 BulkInsert 大致设计方式为 通过当前DbContext 获取当前连接字符串,调用连接字符串获取当前实体的所有字段及字段属性,映射到DataTable中 在调用Sy ...
- Linq快速入门——扩展方法
Linq为我们提供了许多扩展方法,方便我们对数据源进行操作(Where,Select...).即使你不了解算法,也能使用Linq当回牛人.扩展方法本质并不是什么高深的技术,说白了就是一个Static静 ...
- linq to sql 扩展方法
老赵的博客:http://blog.zhaojie.me/2008/02/using-translate-method-and-modify-command-text-before-query-in- ...
- linq 的Distinct 扩展方法.
List<miniclass> classs = new List<miniclass>(); classs.Add(new miniclass() { token = &qu ...
- Linq扩展方法获取单个元素
在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明 ...
- LinQ—扩展方法
概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...
- Enumerable 下又有新的扩展方法啦,快来一起一睹为快吧
一:背景 1. 讲故事 前段时间将公司的一个项目从 4.5 升级到了 framework 4.8 ,编码的时候发现 Enumerable 中多了三个扩展方法: Append, Prepend, ToH ...
随机推荐
- ORACLE常用语句:
ORACLE常用语句: 1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password: 新 ...
- python4.3内置函数
常见的内置函数 a=[12,31,31,232,34,32,43,54,36]max1=max(a)#最大函数print(max1)min1=min(a)#最小函数print(min1)sum1=su ...
- Java线程生命周期与状态切换
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...
- 使用 .NET Core 3.x 构建 RESTFUL Api
准备工作:在此之前你需要了解关于.NET .Core的基础,前面几篇文章已经介绍:https://www.cnblogs.com/hcyesdo/p/12834345.html 首先需要明确一点的就是 ...
- java标识符、关键字、基本数据类型
一 标识符与关键字 1.标识符 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等, 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,不能以数字开头, 不能是 ...
- C#LeetCode刷题-极小化极大
极小化极大篇 # 题名 刷题 通过率 难度 375 猜数字大小 II 23.4% 中等 464 我能赢吗 25.5% 中等 486 预测赢家 40.4% 中等 843 猜猜这个单词 2 ...
- C#LeetCode刷题之#788-旋转数字(Rotated Digits)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3967 访问. 我们称一个数 X 为好数, 如果它的每位数字逐个地 ...
- imx28x arm-gcc arm-linux-4.4.4 EasyARM-iMX283
gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 提取码: UgUtMUNX
- 第一个Mybatis
第一个Mybatis 思路:搭建环境-->导入Mybatis-->编写代码-->测试 1.搭建环境 新建maven工程,配置xml文件 <?xml version=" ...
- Ansible常用模块-yum模块
yum模块 name 必选 指定安装包名 state 执行命令 present installed removed latest absent 其中installed and present等效 ...