EntityFramework Core 3.0查询
前言
随着.NET Core 3.0的发布,EF Core 3.0也随之正式发布,关于这一块最近一段时间也没太多去关注,陆续会去对比之前版本有什么变化没有,本节我们来看下两个查询。
分组
我们知道在EF Core 3.0版本之前,对于分组查询是在客户端评估,也就是说在内存中操作,在EF Core 3.0版本后对于分组查询可以翻译成SQL在数据库进行,但是事实情况真的是这样吗?接下来我们来看下吧,如下给出代码例子。
public class EFCoreDbContext : DbContext
{
public EFCoreDbContext()
{ }
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer(@"Server=.;Database=EFTest;Trusted_Connection=True;");
} public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; }
} public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public Blog Blog { get; set; }
}
接下来我们在控制台进行如下查询:
var context = new EFCoreDbContext(); var posts = context.Posts.GroupBy(d => d.BlogId)
.Select(g => new
{
id = g.Key,
count = g.Count()
})
.ToList();
上述我们查询每一篇博客的文章数组,我们通过SQL Profiler跟踪到上述示例代码最终翻译成的SQL如我们所期望的那样,如下图:
假设现在有这样一个场景:查询所有博客发表的第一篇博客文章。基于这种场景我们需要对发表博客文章进行分组,然后取第一篇,所以接下来我们进行如下查询:
var context = new EFCoreDbContext(); var posts = context.Posts.GroupBy(d => d.BlogId)
.Select(g => g.FirstOrDefault())
.ToList();
既然这样无法翻译,根据官方文档可以使用Linq to Object进行查询《https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/》 ,那么我们就修改成如下代码查询看看:
var context = new EFCoreDbContext(); var posts = context.Posts.GroupBy(d => d.BlogId).AsEnumerable()
.Select(d => d.FirstOrDefault())
.ToList();
咋客户端都无法支持了呢?我们只是想查询所有博客列表中第一篇文章,按照我们的理解,理论上是可以进行翻译的对不对,比如翻译成如下直接写的SQL语句:
SELECT
Id,BlogId,Title,Content
FROM (
SELECT *
,ROW_NUMBER() OVER (
PARTITION BY BlogId
ORDER BY Id
) AS [ROW NUMBER]
FROM dbo.Posts
) groups
WHERE groups.[ROW NUMBER] = 1
ORDER BY groups.Id DESC
所以到这里我们大概可以猜测出EF Core对分组查询支持的并不是那么好,目前应该只支持简单的分组求和而已,稍微复杂一点则无法翻译,所以我们还是老老实实将分组还是完全放在客户端评估吧,如下:
var context = new EFCoreDbContext(); var posts = context.Posts.ToList().GroupBy(d => d.BlogId)
.Select(d => d.FirstOrDefault())
.ToList();
查找
我们可以通过 EF.Functions.Like 来进行模糊查询,我们可以通过StartWith或EndWith来查询开头或结尾的数据,要是现在需要查询出博客文章标题中包含某一字符的文章列表,我们又该如何查询呢?我们想到通过IndexOf来查询,接下来我们来看看:
var context = new EFCoreDbContext(); var posts = context.Posts.Where(d => d.Title.IndexOf('C') == ).ToList();
难道我们又只能将所有查询出来,然后在内存中操作吗?代码如下:
var context = new EFCoreDbContext(); var posts = context.Posts.ToList().Where(d => d.Title.IndexOf('C') == ).ToList();
其实我们只要将上述单引号修改双引号即可解决完全在客户端评估的问题,如下:
var context = new EFCoreDbContext(); var posts = context.Posts.Where(d => d.Title.IndexOf("C") == ).ToList();
根据我们的查询描述,我们明明是想查询在标题中查询指定字符,为何对字符不能支持,只支持字符串呢,不知道官方是出于何种原因。同时这里我们也注意到,无论是MySQL还是SQL Server等等,尽量不要将表中列设置为可空,即使是可空也要设置为不可空,给定一个默认值即可,一旦数据量巨大时,会发现查询很慢,因为通过IS NULL或者IS NOT NULL不走索引导致。比如上述我们查询的Title,我们无论是通过Data Annotations还是Fluent Api,都必须配置成不可空,比如这里我们通过Data Annotations配置如下:
[Required]
public string Title { get; set; }
此时我们继续进行上述查询时候,会发现对空值的判断已经没有了,同时也减少了查询语句,如下:
总结
请注意上述我所演示EF Core版本为3.0.1。本节我也只是通过简单的示例稍微给大家看了EF Core 3中一些小的问题,当然可能还存在其他的问题,更多细节等我后续研究会继续给出EF Core 3.x系列文章,感谢您的阅读,若有叙述不当或错误之处,还望指正,谢谢。
EntityFramework Core 3.0查询的更多相关文章
- EntityFramework Core 2.0执行原始查询如何防止SQL注入?
前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...
- EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
前言 EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应.显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查 ...
- EntityFramework Core 2.0全局过滤(HasQueryFilter)
前言 EntityFramework Core每一次版本的迭代和更新都会带给我们惊喜,每次都会尽量满足大部分使用者的需求.在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilte ...
- .NetCore技术研究-EntityFramework Core 3.0 Preview
前段时间.Net Core 3.0 发布了,Entity Framework Core 3.0 也发布了Preview版.假期用了一上午大致研究了一遍,同时又体验了一把Visual Studio 20 ...
- EntityFramework Core笔记:查询数据(3)
1. 基本查询 1.1 加载全部数据 using System.Linq; using (var context = new LibingContext()) { var roles = contex ...
- EntityFramework Core 2.0自定义标量函数两种方式
前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...
- EntityFramework Core健康检查
前言 .NET Core提供对应方法可进行健康检查,那么在EF Core中是否也提供了相应的方式呢?EF Core 2.2+(包含2.2)版本提供了针对上下文的健康检查,接下来我们直接利用.NET 5 ...
- EntityFramework Core查询问题集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
随机推荐
- 修改linux系统history命令的条数和格式
在一次测试环境遇到的情况,发现服务莫名其妙挂了,以为服务有bug,查了一下午,后来一个同事说,是我把服务关了啊.... 是可忍孰不可忍,原生的history命令,只能看到输入的命令历史,看不到什么时候 ...
- vue事件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Jquery动态bind绑定已有函数,函数自动执行的问题解决方法
在bind后面的方法,不能带括号,带括号函数就自动执行了... <script> //通过子元素删除某行 function deleteRow() { var flag = confirm ...
- Python爬虫常用小技巧之设置代理IP
设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...
- 学习笔记07axps页面
apsx分前台文件和后台文件,前台文件(子类)是继承了后 台的aspx.cs(父类), 1.在aspx中,使用<% %>能执行一段C#代码使用<%=C#代码%>,就是直接向前台 ...
- Apache的虚拟主机功能
Apache的虚拟主机功能 (Virtual Host) 是可以让一台服务器基于IP.主机名或端口号实现提供多个网站服务的技术. 第一种情况:基于IP地址 这种情况很常见:一台服务器拥有多个IP地址, ...
- 谷歌Chrome浏览器无法安装插件的解决方法(本文干货!)
这个问题困扰了我很久,作为小白学习可能会用到谷歌插件,奈何谷歌也太变态,国内的环境无法正常登录谷歌账户.无法访问应用商店,而Chrome主版本号大于66的只能从Chrome应用商店下载并安装插件,各种 ...
- Python基本数据结构之文件操作
用word操作一个文件的流程如下: 1.找到文件,双击打开 2.读或修改 3.保存&关闭 用python操作文件也差不多: f=open(filename) # 打开文件 f.write(&q ...
- 最新JetBrains PyCharm 使用教程--常用快捷键和设置PyCharm为Eclipse快捷键(四)
PyCharm常用快捷键使用 Ctrl + D:复制当前行 Ctrl + Y:删除当前行 Ctrl + Z 撤销 Shift + Enter:快速换行 Ctrl + /:快速注释 Ctrl + F: ...
- python函数的基本语法<一>
函数: 一次定义,多次调用,函数可以变相看成变量函数的阶段: 1.定义阶段 2调用阶段 形参和实参: 定义阶段的参数叫形参,调用阶段的参数叫实参 函数的几种基本用法: #多变量 def test(na ...