例如,可以将产品表与产品类别表相联接,得到产品名称和与其相对应的类别名称

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效果相关推荐

  1. Lamda表达式好处、Lamda表达式演变、Lamda表达式使用总结

    Lamda表达式好处.Lamda表达式演变.Lamda表达式使用总结 使用Lamda表达式的好处 Functional Interfere:函数式接口 Lamda表达式的演变过程 1.一个接口对应多个 ...

  2. Qt 工具类(05):在Qt里使用Lamda表达式

    文章目录 一.前言 二.什么是Lamda表达式? 2.1. Lambda 表达式的语法 2.2.Lambda函数的捕获列表 三.在Qt中使用Lambda表达式函数 3.1.信号连接Lambda 3.2 ...

  3. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托

    委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate).   声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...

  4. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式...

    为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...

  5. Java --Lamda表达式

    Lamda:属于函数式编程的概念: interface IMessage {public void print() ; } public class TestDemo {public static v ...

  6. 什么是lamda表达式?

    我们首先来看一下这一片代码: 1 class Solution { 2 public: 3 int singleNumber(int A[], int n) { 4 // Note: The Solu ...

  7. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

    [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...

  8. 带参的信号、lamda表达式及坐标系统

    带参的信号.lamda表达式及坐标系统 文章目录 带参的信号.lamda表达式及坐标系统 一.带参的信号 二.lamda表达式 三.坐标系统 一.带参的信号 1. 自定义信号(这个信号不像标准信号是一 ...

  9. 静态内部类、局部内部类、匿名内部类、lamda表达式

    普通的继承: 静态内部类( 必须有static修饰): 局部内部内(写在任意方法中的): 匿名内部类(可以写在任意位置): lamda表达式(感觉像匿名内部类的简化)(前题是函数式接口:接口中只有一个 ...

  10. 一个小案例精通lamda表达式与函数式接口

    前言:只有基础(多态.匿名接口实现类)足够扎实才能更好的学习花拳绣腿(lamda表达式),Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...

最新文章

  1. 算法--------数组类---------总结
  2. 第十一周项目实践2 用邻接表存储的图来实现基本应用
  3. android用qq浏览器打开微信网页版,QQ浏览器怎么打开微信小程序?
  4. jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器
  5. 第二节 CSS入门介绍
  6. 测试环境安装配置obproxy(社区版)
  7. 鸿合科技成为AMX品牌全系列产品中国(大陆)总代理
  8. atitit 信息化2.0概论 艾提拉解读版读书笔记.docx 目录 1. 企业信息化1.0时代 1.1.6 C/S模式和B/S模式的好坏 1.1.7 大集中的争议 1.1.8 没有解决的孤岛问
  9. 瑞星力荐金山毒霸 原来是广告程序 作崇
  10. Python入门必备五本书籍,精华满满,直击重心
  11. 【安装配置】SAS9.4安装
  12. js根据身份证号码计算年龄的方法
  13. 教你炒股票24:MACD对背弛的辅助判断
  14. git如何切换dev_git 切换远程分支
  15. 软件工程——数据流图(DFD)
  16. python批量图片合并
  17. 一级建造师能挂靠到三级资质的企业吗?
  18. 开启元宇宙新时代,VR全景,体验虚拟展厅
  19. SPOJ GSS2 Can you answer these queries II
  20. C++ 百钱百鸡问题

热门文章

  1. 树莓派安装Homeassistant智能家居
  2. 电商物流就是昨天的外卖乱战?千亿市场到底该如何整合
  3. markdown文本居中
  4. WEB前端缓存解决方案
  5. 百度地图点击地图获取地址
  6. Python3 读取word中的表格,根据表格第一行标题行查找想要的表格
  7. python中文件分类_利用Python将文件进行分类整理
  8. 如何运用eclipse的编写Java程序
  9. httpclient用法大全
  10. 第三十三章 SQL命令 DROP INDEX