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 ...
随机推荐
- Ubuntu 16 server 安装 tensorflow-GPU
目录 显卡驱动安装 CUDA安装 cuDNN安装 tensorflow-gpu安装 本次使用主机配置: cpu:i7-8700K 显卡:GTX-1080Ti 一.安装显卡驱动 打开命令窗口(c ...
- 无法打开msvcrtd.lib
- MUI错误信息:系统已经存在较高版本,些安装包无法安装。
MUI 混合开发APP 版本更新问题. 错误信息: 解决方法: manifest.json->version->code 这个值需要累加,version->name 是用于显示的,这 ...
- [爬虫]用python的requests模块爬取糗事百科段子
虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更 ...
- *args和**kwargs的作用
∗args的作用: *的作用有2个 打包参数(pack)和拆分参数(unpack) 函数接受实参时,按顺序分配给函数形参,如果遇到带∗的形参,那么就把还未分配出去的实参以元组形式打包(pack),分配 ...
- 深入了解 Java Resource && Spring Resource
在Java中,为了从相对路径读取文件,经常会使用的方法便是: xxx.class.getResource(); xxx.class.getClassLoader().getResource(); 在S ...
- 微信小程序如何解析html内容
最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...
- csp-s 66
我向来只在考砸的时候写博客.这次题很水,但是我极没有状态,我T1没看题目前面的话: 不知道这个条件的我蒙蔽的答题.推各种柿子,想这个矩阵的特殊构造,就是同行的构造,然后我T1想了1个多小时,然后死了! ...
- lenovo ubuntu18.04 找不到网络适配器
链接: https://pan.baidu.com/s/1YJl-MfG0tVy9sLx4_otmnA 提取码: smfp https://blog.csdn.net/John_chaos/artic ...
- PHP获取图片每个像素点
PHP获取图片每个像素点<pre> $i = imagecreatefromjpeg("test.jpg"); //图片路径 for ($x = 0; $x < ...