Lamda 表达式里的Join和GroupJoin的区别, 如何实现SQL的Left Join效果
例如,可以将产品表与产品类别表相联接,得到产品名称和与其相对应的类别名称
db.Products .Join ( db.Categories, p => p.CategoryID, c => c.CategoryID, (p, c) => new {p,c.CategoryName} ) .Where(p => p.CategoryID == 1);
这个Join对应SQL里的inner Join, 这个很容易理解. 上面代码里红色的c的类型是Category
如果我要达到SQL里Left Join的效果, 该怎么写呢? 想当然的以为,把Join改成GroupJoin,
db.Products .GroupJoin ( db.Categories, p => p.CategoryID, c => c.CategoryID, (p, cs) => new {p,cs.FirstOrDefault().CategoryName} ) .Where(p => p.CategoryID == 1);
上面代码里红色的cs的类型是IEnumerable<Category>, 你用FirstOrDefault()只是拿到一个目录,万一Product Left join是有多个目录呢?
所以要用.SelectMany把IEnumerable<Category> 把里面的每一个元素做投影.
要注意加上DefaultIfEmtyp() 才是Left join, 假如没有加这个,还是Inner Join
db.Products .GroupJoin(db.Categories,(Product p) => p.CategoryId,(Category c) => c.CategoryId,(prod, cs) => new { prod, cs }) // cs is IEnumerable<Category>.SelectMany(prodCats => prodCats.cs.DefaultIfEmpty(), (prodCats, c) =>new{prodCats.prodcategoryName = c.CategoryName});
用LinQ query表达式 对应的写法是
var qry =from p in db.Productsjoin c in db.Categories on p.CategoryId equals c.CategoryIdinto g from pc in g.DefaultIfEmpty()select new { prodId = p.ProdId,prodCode = p.ProdCode,prodName = p.ProdName,categoryName = g.FirstOrDefault().CategoryName};
如果我只用DefaultIfEmpty(),不用GroupJoin,这样写能达到这个效果吗?
var qry = db.Products.SelectMany(p => db.Categories.Where(c => c.CategoryId == p.CategoryId).DefaultIfEmpty(),(p, c) => new{p.ProdId,p.ProdCode,p.ProdName,c.CategoryName});
这样写,如果数据量大,性能会很差. 因为它会把Products和Categories都Load到内存里,再Match, 而不是用SQL Left Join
参考文章:
https://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-using-linq-extension-methods
http://linqsamples.com/linq-to-objects/join/GroupJoin-linq
https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-left-outer-joins
转载于:https://www.cnblogs.com/Jayesslee/p/9306328.html
Lamda 表达式里的Join和GroupJoin的区别, 如何实现SQL的Left Join效果相关推荐
- Lamda表达式好处、Lamda表达式演变、Lamda表达式使用总结
Lamda表达式好处.Lamda表达式演变.Lamda表达式使用总结 使用Lamda表达式的好处 Functional Interfere:函数式接口 Lamda表达式的演变过程 1.一个接口对应多个 ...
- Qt 工具类(05):在Qt里使用Lamda表达式
文章目录 一.前言 二.什么是Lamda表达式? 2.1. Lambda 表达式的语法 2.2.Lambda函数的捕获列表 三.在Qt中使用Lambda表达式函数 3.1.信号连接Lambda 3.2 ...
- 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托
委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate). 声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...
- 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式...
为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...
- Java --Lamda表达式
Lamda:属于函数式编程的概念: interface IMessage {public void print() ; } public class TestDemo {public static v ...
- 什么是lamda表达式?
我们首先来看一下这一片代码: 1 class Solution { 2 public: 3 int singleNumber(int A[], int n) { 4 // Note: The Solu ...
- [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...
- 带参的信号、lamda表达式及坐标系统
带参的信号.lamda表达式及坐标系统 文章目录 带参的信号.lamda表达式及坐标系统 一.带参的信号 二.lamda表达式 三.坐标系统 一.带参的信号 1. 自定义信号(这个信号不像标准信号是一 ...
- 静态内部类、局部内部类、匿名内部类、lamda表达式
普通的继承: 静态内部类( 必须有static修饰): 局部内部内(写在任意方法中的): 匿名内部类(可以写在任意位置): lamda表达式(感觉像匿名内部类的简化)(前题是函数式接口:接口中只有一个 ...
- 一个小案例精通lamda表达式与函数式接口
前言:只有基础(多态.匿名接口实现类)足够扎实才能更好的学习花拳绣腿(lamda表达式),Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...
最新文章
- 算法--------数组类---------总结
- 第十一周项目实践2 用邻接表存储的图来实现基本应用
- android用qq浏览器打开微信网页版,QQ浏览器怎么打开微信小程序?
- jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器
- 第二节 CSS入门介绍
- 测试环境安装配置obproxy(社区版)
- 鸿合科技成为AMX品牌全系列产品中国(大陆)总代理
- atitit 信息化2.0概论 艾提拉解读版读书笔记.docx 目录 1. 企业信息化1.0时代 1.1.6 C/S模式和B/S模式的好坏 1.1.7 大集中的争议 1.1.8 没有解决的孤岛问
- 瑞星力荐金山毒霸 原来是广告程序 作崇
- Python入门必备五本书籍,精华满满,直击重心
- 【安装配置】SAS9.4安装
- js根据身份证号码计算年龄的方法
- 教你炒股票24:MACD对背弛的辅助判断
- git如何切换dev_git 切换远程分支
- 软件工程——数据流图(DFD)
- python批量图片合并
- 一级建造师能挂靠到三级资质的企业吗?
- 开启元宇宙新时代,VR全景,体验虚拟展厅
- SPOJ GSS2 Can you answer these queries II
- C++ 百钱百鸡问题