快读《ASP.NET Core技术内幕与项目实战》EFCore2.5:集合查询原理揭秘(IQueryable和IEnumerable)
本节内容,涉及4.6(P116-P130)。主要NuGet包:如前述章节
一、LINQ和EFCore的集合查询扩展方法的区别
1、LINQ和EFCore中的集合查询扩展方法,虽然命名和使用完全一样,都两者定义在不同的命名空间下,是不同的方法。PS:LINQ定义在System.Linq中,EFCore定义在Microsoft.EntityFrameworkCore中
2、我们将集合操作的扩展方法,划分为两类:①非立即执行方法,如Where、OrderBy、Select、GroupBy、Skip、Take、Include等;②立即执行方法:如Min、Max、Count、Sum、ToArray、ToList<T>、foreach等。
3、当执行非立即方法时,LINQ返回IEnumerable集合,EFCore返回IQueryable集合。两者最大区别为:LINQ会立即在服务器内存中执行计算(客户端评估);而EFCore会延迟执行,只有当我们执行立即执行方法后,EFCore才会将之前定义的所有非立即执行方法,整合为SQL抛到数据库执行(服务端评估)。
4、利用EFCore中IQueryable的特点,我们就可以充分利用客户端评估和服务端评估,达到延迟执行、简化代码、复用代码、平衡性能等目的
//LINQ返回IEnumerable
var nums = new int[] { 1, 2, 3, 4 };
var numsNew = nums.Where(n => n > 2); //EFCore返回IQueryable
using var ctx = new MyDbContext();
var books= ctx.Book.Where(a => a.Id > 0);
二、IQueryable的延迟执行案例
//利用IQueryable延迟执行,拼接复杂查询 //定义一个复杂查询的方法,接受参数①关键词;②是否同时匹配书名和作者名;③是否按价格排序;④最高价格
void QueryBooks(string searchWords, bool searchAll, bool orderByPrice, double upperPrice)
{
using var ctx = new MyDbContext(); //查询低于最高价
var books = ctx.Books.Where(b => b.Price <= upperPrice); //同时匹配书名和作者
if(searchAll)
{
books = books.Where(b => b.Title.Contains(searchWords) || b.AuthorName.Contains(searchWords));
}
//只匹配书名
else
{
books = books.Where(b =>b.Title.Contains(searchWords));
} //按照价格排序
if(orderByPrice)
{
books = books.OrderBy(b => b.Price);
} //立即执行方法,遍历
foreach(var item in books)
{
Console.WriteLine($"书名:{item.Title},作者:{item.AuthorName}");
}
} //调用方法
QueryBooks("LINQ", true, true, 30); //查询书名或作者名,按价格排序
QueryBooks("LINQ", false, false, 50); //只查询书名,不按价格排序
三、复用IQueryable的案例
//获得一个IQueryable集合books,并三次复用它
var books = ctx.Books.Where(b => b.Price >=20); //使用books集合,执行一次立即查询
Console.WriteLine(books.Count()); //再次使用books集合,执行第二次立即查询
Console.WriteLine(books.Max(b => b.Price)); //第三次立即查询
foreach (var item in books.Where(b => b.PubTime.Year > 2000))
{
Console.WriteLine(item.Title);
}
四、结合使用服务端评估和客户端评估的案例
//使用立即执行方法ToList,执行SQL查询(服务端评估),将结果存到服务器的内存中
var books = await ctx.Books.Take(100000).ToListAsync(); //使用服务器内存中的集合books,进行遍历查询,在服务器上执行(客户端评估)
foreach (var item in books)
{
Console.WriteLine(item.Title);
} //由于遍历条数比较多,需要一定时间
//如果在遍历过程中,我们关闭数据库服务器,程序仍然可以正常进行
//说明遍历前,已经将数据下载到客户端 //大多数情况下,我们应该复用IQueryable,但在方法返回IQueryable,或嵌套遍历不同的DbSet时,需要考虑特别注意 //出错情况1:方法返回IQueryable
//方法中返回IQueryable时,会销毁上下文
//正确应该返回:return ctx.Books.Where(b => b.Id>5).ToList();
IQueryable<Book> QueryBooks()
{
using var ctx = MyDbContext();
return ctx.Books.Where(b => b.Id>5);
} foreach(var item in QueryBooks())
{
Console.WriteLine(item.Title);
} //出错情况2:嵌套遍历不同的DbSet
//嵌套循环,导致两个DataReader执行,大多数数据库不允许多个DataReader同时执行
var books = ctx.Books.Where(b => b.Id > 1);
foreach(var item1 in books)
{
Console.WriteLine(item1.Title);
foreach(var item2 in ctx.Authors)
{
Console.WriteLive(item2.Id);
}
}
五、最后一个综合案例:分页查询
//定义一个分页查询方法,参数为获取第几页-pageIndex,每页显示几条-pageSize
void OutputPage(int pageIndex, int pageSize)
{
using var ctx = new MyDbContext(); //获取IQueryable集合books
var books = ctx.Books(); //复用books,计算集合总条数。LongCount方法和Count的功能一样
long count = books.LongCount(); //按每页显示条数pageSize,计算总页数
//使用了Math的Ceiling方法,如有小数,取天花板值,最后转换类型为long
long pageCount = (long)Math.Ceiling(count * 1.0 / pageSize);
Console.WriteLine($"总页数:{pageCount}"); //复用books,获取指定页码的数据,并遍历
//使用了Skip和Take方法
var pageIndexBooks = books.Skip((pageIndex - 1) * pageSize).Take(pageSize);
foreach( var item in pageIndexBooks)
{
Console.WriteLine(item.Title)
}
} //调用方法
OutputPage(1,10); //第1页,每页显示10条
OutputPage(3,5); //第3页,每页显示5条
特别说明:
1、本系列内容主要基于杨中科老师的书籍《ASP.NET Core技术内幕与项目实战》及配套的B站视频视频教程,同时会增加极少部分的小知识点
2、本系列教程主要目的是提炼知识点,追求快准狠,以求快速复习,如果说书籍学习的效率是视频的2倍,那么“简读系列”应该做到再快3-5倍
快读《ASP.NET Core技术内幕与项目实战》EFCore2.5:集合查询原理揭秘(IQueryable和IEnumerable)的更多相关文章
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...
- 简读《ASP.NET Core技术内幕与项目实战》之3:配置
特别说明:1.本系列内容主要基于杨中科老师的书籍<ASP.NET Core技术内幕与项目实战>及配套的B站视频视频教程,同时会增加极少部分的小知识点2.本系列教程主要目的是提炼知识点,追求 ...
- 《ASP.NET Core技术内幕与项目实战》精简集-目录
本系列是杨中科2022年最新作品<ASP.NET Core技术内幕与项目实战>及B站配套视频(强插点赞)的精简集,是一个读书笔记.总结和提炼了主要知识点,遵守代码优先原则,以利于快速复习和 ...
- ASP.NET Core 2.0 MVC项目实战
一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...
- ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】
到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...
- ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package
目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...
- ASP.NET Core 2.0 : 三. 项目结构
本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Core 2.0的项目结构.(此后的文章也尽量这样对比着, 方便学习理解.) 关注差异, 也为项目迁移做准备. 新建项目 ...
- ASP.NET Core Web多语言项目
公司效益好了,准备和国外做生意,这个时候就需要多语言了. > 1. 这是一个ASP.NET Core Web多语言项目,主要展示项目的不同: > 2. 第一种:www.xxx.com/en ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
随机推荐
- Spring源码 11 IOC refresh方法6
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- 100行代码实现一个RISC-V架构下的多线程管理框架
1. 摘要 本文将基于RISC-V架构和qemu仿真器实现一个简单的多线程调度和管理框架, 旨在通过简单的代码阐明如何实现线程的上下文保存和切换, 线程的调度并非本文的重点, 故线程调度模块只是简单地 ...
- RunCat 怎么白嫖付费图标?这篇文章告诉你!
RunCat 怎么白嫖付费图标?这篇文章告诉你! 什么是RunCat 为什么要破解RunCat 开始破解 所以可以看出第一个文件就是我们运行图标选项的数据,而stocks.json的就是图标商店的数据 ...
- 2-1 走进selenium新世界
走进Selenium新世界 浏览器 Firefox Setup 35.0.1 安装完成后设置菜单栏 关闭浏览器自动更新 插件配置(必备武器) FireBug Firebug是firefox下的一个扩展 ...
- [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
考点:JWT身份伪造.python pickle反序列化.逻辑漏洞 1.打开之后首页界面直接看到了提示信息,信息如下: 2.那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看下一 ...
- Docker 搭建 Nexus3 私服 | 基本操作
1 Docker 安装 Nexus3 1.1 创建目录 在硬盘上创建 Nexus3 的主目录: mkdir -p /Users/yygnb/dockerMe/nexus3 为该目录添加权限: chmo ...
- 排序算法整理C++(初赛)
排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序. 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1 ...
- 2021年3月-第01阶段-Linux基础-Linux系统概念-Linux命令
Linux系统基本概念 图形界面: Ctrl+Shift +号 //调整命令终端变大 Ctrl - 号 //调整命令终端变小 命令终端: ~ 家目录:用户的私有场所,其他用户不能随便访问 root超级 ...
- 四元数Quaternion的基本运算
技术背景 在前面一篇文章中我们介绍了欧拉角死锁问题的一些产生背景,还有基于四元数的求解方案.四元数这个概念虽然重要,但是很少会在通识教育课程中涉及到,更多的是一些图形学或者是工程学当中才会进行讲解.本 ...
- containerd使用总结
# 安装 yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linu ...