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 == );
这个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效果的更多相关文章
- [C#]使用Join与GroupJoin将两个集合进行关联与分组
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参 ...
- C#中使用Join与GroupJoin将两个集合进行关联与分组
转自:https://www.cnblogs.com/cncc/p/7985843.html 对于Join的用法说明如下: 语法: public static IEnumerable<TResu ...
- LINQ的左连接、右连接、内连接和Lamda表达式实现Left join
1.左连接: var LeftJoin = from t1 in l1join t2 in l2on t1.ID equals t2.ID into Joinedt12from t3 in Joine ...
- SQL、Linq、lamda表达式 同一功能不同写法
一.SQL.Linq.lamda表达式 同一功能不同写法 SQL LINQ Lambda SELECT * FROM HumanResources.Employee from e in Employe ...
- 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现
前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...
- Linq和Lamda表达式的简单处理方式
一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...
- python 内置函数 lamda表达式。 open 文件方法
lamda 表达式 lambda表达式 学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 普通的条件语句 if 1 == 1: name = 'kaixin' else: ...
- LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法
介绍 ·Select - Select选择:延迟 ·Where - Where查询:延迟 ·OrderBy - 按指定表达式对集合正序排序:延迟 ·OrderByDescend ...
- 让操作javascript对象数组像.net lamda表达式一样
让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...
随机推荐
- JS中的document.title可以获取当前网页的标题
<!DOCTYPE html> <html> <head> <title>jb51.net</title> </head> &l ...
- C.【转】C语言字符串与数字相互转换
1.gcvt 把浮点数转成字符串 - CSDN博客.html(https://blog.csdn.net/dxuehui/article/details/52791412) 1.1. 函数名: gcv ...
- STL_map.VC6简单使用例子
1. #include <windows.h> //使用map时会出现如下警告:主要意思是 identifier was truncated to '255' characters in ...
- Spring Bean的生命周期例子
以下例子源于:W3Cschool,在此作记录 HelloWorld.java package com.how2java.w3cschool.beanlife; public class HelloWo ...
- SpringBoot:Maven创建一个HelloWorld
先看一下百度百科的解释: Maven项目对象模型(POM:project object model),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件. Maven的核心功能便是合 ...
- kotlin - 空安全
空安全设计的操作符号 操作符 作用 ? 可空操作符,声明该值可为空 ?. 安全调用操作符 b?.length 如果b非空,就返回b.length,否则返回 null !! 非空断言运算符, ...
- 力扣(LeetCode)219. 存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示例 1: 输入: nums = ...
- CSS opacity的兼容写法
opacity{ opacity:0.5; filter:alpha(opacity=50); //filter 过滤器 兼容IE678 }
- vue 上传单个图片自定义增加progress改良用户体验
<el-tab-pane label="开发商logo" name="first" style="position: relative;&quo ...
- 第 7 章 多主机管理 - 047 - 管理 Machine
管理 Machine Docker Machine 则很简单 docker-machine env host1 显示访问 host1 需要的所有环境变量: 根据提示,执行 eval $(docker- ...