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 ...
随机推荐
- boost之signal的使用
文章目录 简介 代码 模板实现: 测试代码 运行结果 简介 boost是C++的一个扩展库,被称为C++准标准库,里面的组件很丰富,并且引用方便,85%的组件只需要引用头文件即可使用. 并且在嵌入式系 ...
- 用 Python 下载抖音无水印视频
说起抖音,大家或多或少应该都接触过,如果大家在上面下载过视频,一定知道我们下载的视频是带有水印的,那么我们有什么方式下载不带水印的视频呢?其实用 Python 就可以做到,下面我们来看一下. 很多人学 ...
- CSS内容布局
网页是由不同内容块构成的:标题.段落.链接.列表.图片.视频,等等. 1.定位 定位并不适合总体布局,因为它会把元素拉出页面的正常流. 元素的初始定位方式为静态定位(static),即块级元素垂直堆叠 ...
- Vue3 为何使用 Proxy 实现数据监听
博客地址:https://ainyi.com/93 vue3 响应式数据放弃了 Object.defineProperty,而使用Proxy来代替它 我们知道,在 vue2 中,实现数据监听是使用Ob ...
- SpringBoot学习之整合Swagger
Swagger介绍 1.什么是Swagger 作为后端程序开发,我们多多少少写过几个后台接口项目,不管是编写手机端接口,还是目前比较火热的前后端分离项目,前端与后端都是由不同的工程师进行开发,那么这之 ...
- CheckList:ACL 2020 Best Paper
Beyond Accuracy: Behavior Testing of NLP Models with CheckList. Marco Tulio Ribeiro, Tongshuang Wu, ...
- CSS3动画旋转——(图片360°旋转)
今天在重构网页特效的时候,想着用到一个css3的旋转特效.简单来一个demo. html <div class="box"> <img src="./y ...
- Vue3 + Element ui 后台管理系统
Vue3 + Element ui 后台管理系统 概述:这是一个用vue3.0和element搭建的后台管理系统界面. 项目git地址: https://github.com/whiskyma/vu ...
- unity探索者之复制内容到剪贴板
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8417014.html unity中提供的TextEditor类,只能在window ...
- unity探索者之微信分享所有流程,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html 很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的 ...