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

db.Products
.Join
(
db.Categories,
p => p.CategoryID,
c => c.CategoryID,
(p, c) => new {p,c.CategoryName}
)
.Where(p => p.CategoryID == );

这个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 == );

上面代码里红色的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.prod
categoryName = c.CategoryName
});

用LinQ query表达式 对应的写法是

            var qry =
from p in db.Products
join c in db.Categories on p.CategoryId equals c.CategoryId
into 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

Lamda 表达式里的Join和GroupJoin的区别, 如何实现SQL的Left Join效果的更多相关文章

  1. [C#]使用Join与GroupJoin将两个集合进行关联与分组

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参 ...

  2. C#中使用Join与GroupJoin将两个集合进行关联与分组

    转自:https://www.cnblogs.com/cncc/p/7985843.html 对于Join的用法说明如下: 语法: public static IEnumerable<TResu ...

  3. LINQ的左连接、右连接、内连接和Lamda表达式实现Left join

    1.左连接: var LeftJoin = from t1 in l1join t2 in l2on t1.ID equals t2.ID into Joinedt12from t3 in Joine ...

  4. SQL、Linq、lamda表达式 同一功能不同写法

    一.SQL.Linq.lamda表达式 同一功能不同写法 SQL LINQ Lambda SELECT * FROM HumanResources.Employee from e in Employe ...

  5. 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现

    前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...

  6. Linq和Lamda表达式的简单处理方式

    一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...

  7. python 内置函数 lamda表达式。 open 文件方法

    lamda 表达式 lambda表达式 学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 普通的条件语句 if 1 == 1: name = 'kaixin' else: ...

  8. LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法

    介绍    ·Select - Select选择:延迟    ·Where - Where查询:延迟    ·OrderBy - 按指定表达式对集合正序排序:延迟    ·OrderByDescend ...

  9. 让操作javascript对象数组像.net lamda表达式一样

    让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...

随机推荐

  1. 不可改变性imutable

    不可改变性是指一些对象在被创建之后不会因为某些方式改变,特别是针对任何可以改变哈希对象的哈希值的方式. 两者相联系是因为哈希键值一定是不可改变的,所以它们对应的哈希键值也不改变. 如果允许它们改变,那 ...

  2. 下载安装 Android sdk

    下载地址: https://www.androiddevtools.cn/ 选择sdk 选择版本 将解压出的整个文件夹复制或者移动到 your sdk 路径/platforms文件夹,然后打开SDK ...

  3. Linux下解包/打包,压缩/解压命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf fileName.tar DirName tar.gz和.tgz 解压:tar zxvf FileName.tar.zi ...

  4. eclipse配置tomcat后出现:java virtual machine launcher Error:Could not ……,Program will exit.

    原贴在stack overflow上:https://stackoverflow.com/questions/50085750/apache-tomcat-9-x-not-working-with-e ...

  5. Codeforces 233 D - Table

    D - Table 思路:dp 首先,第i列的个数肯定和第i - n列个数一样,假设[i - n + 1, i - 1] 之间的个数之和为x,那么第i列和第i-n列的个数应该是n - x 那么我们可以 ...

  6. Python redis 简单介绍

    Python redis 简单介绍 1.安装 终端输入: pip(or)pip3.6 install redis 安装成功 2.哈哈,发现我并没有redis服务可以访问,所以到这里,在本机安装了red ...

  7. react点滴

    1.<SubSubComp {...this.props } /> 传递属性,{...props}的方式为组件传递了这两个属性,这就是JSX中的延展属性,"..."成为 ...

  8. POSTMAN模拟http请求

    附加小知识: chrome浏览器fitler中的XHR作用是什么? 记录ajax中的请求. AJAX :异步 JavaScript 和 XML 1.是一种用于创建快速动态网页的技术. 2. 通过在后台 ...

  9. css图片的全屏显示代码-css3

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  10. drf 生成接口文档

    REST framework可以自动帮助我们生成接口文档.接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 REST framewrok生成接口文档 ...