查缺补漏系统学习 EF Core 6 - 原始 SQL 查询

推荐关注「码侠江湖」星标,时刻不忘江湖事

这是 EF Core 系列的第五篇文章,上一篇文章盘点了 EF Core 中的几种数据查询方式。

但是有有时候,我们可能无法用标准的 LINQ 方法完成查询任务。

或者编译后的 LINQ 查询,没有我们想要的那么高效;又或者我们想要调用一个存储过程。

这些情况下,我们希望可以编写原始 SQL 语句,让 EF Core 去执行。

因此,这篇文章就简要的讲一讲如何在 EF Core 中使用原始 SQL 语句进行查询。

点击上方或后方蓝字,阅读 EF Core 系列合集。

ad3127b697bef6a9395571b2f7662d7d.png

FromSqlRaw

让我们来看一个简单的示例:

var account = _context.Accounts.FromSqlRaw(@"SELECT * FROM Account WHERE Name = {0}", "Zilor").FirstOrDefault();

FromSqlRaw 方法允许我们将原始 SQL 语句,添加到 EF Core 查询中。

还可以执行存储过程:

var account = _context.Accounts.FromSqlRaw("EXECUTE dbo.MyCustomProcedure").ToList();

需要注意的是 FromSqlRaw 方法有一些限制:

  • 结果中的列名,必须与属性被映射到的列名相匹配

  • 查询必须为实体或查询类型的所有属性返回数据

  • SQL 查询不能包含导航关系,但我们总是可以把 FromSqlRawInclude 方法结合起来。

如果想在查询中包含导航关系,可以这样做:

var account = _context.Accounts.FromSqlRaw("SELECT * FROM Account WHERE Name = {0}", "Zilor").Include(e => e.AccountSubjects).FirstOrDefault();

ExecuteSqlRaw

FromSqlRaw 可以执行原始 SQL 语句查询,但不能执行插入、删除、更新等 SQL 语句,这需要使用 ExecuteSqlRaw 方法实现,比如这样:

var rowsAffected = _context.Database.ExecuteSqlRaw(@"UPDATE AccountSET Age = {0} WHERE Name = {1}",20, "Zilor");

这个方法会返回受影响的行数,无论是从数据库中更新、插入还是删除记录,行为都一样。

需要注意是,这里我们使用了 Database 属性,来调用 ExecuteSqlRaw 方法

而在之前的例子中,我们都是使用 Account 属性,来调用 FromSqlRaw 方法。

另一件重要的事情是,我们在 FromSqlRawExecuteSqlRaw 方法中,都使用了查询字符串插值功能。

它允许我们在查询字符串中放置一个变量名,然后 EF Core 会检查这些参数。

检查参数的目的,是为了以防止 SQL 注入攻击。

因此,我们不能在 EF Core 原始 SQL 查询方法之外,使用字符串插值组装 SQL 语句。因为,这样会失去 SQL 参数注入攻击的检测。

虽然直接执行 SQL 语句的方式比较直接,但缺点就是在代码中直接操作数据库的方式,不符合 ORM 的编程模式与思想。

如果我们直接操作数据库表,那么就无法利用 EF Core 强类型的特性。

如果实体模型发生改变,那么必须手动变更 SQL 语句。

而且如果调用了一些某些数据库特有的语法和函数,那么一旦程序迁移到其他数据库,就可能需要重新编写 SQL 语句。

这样也就无法利用 EF Core 强大的 SQL 翻译机制,来屏蔽不同底层数据库的差异。

所以,在能不用的情况下,最好不要使用执行原生 SQL 语句的功能。

重新加载

假设我们有一个已经加载的实体,然后使用 ExecuteSqlRaw 方法,对数据库中的实体做了一些修改,那此时我们加载的实体肯定是过时。

比如这样:

var accountForUpdate =_context.Accounts.FirstOrDefault(s => s.Name.Equals("Zilor"));var rowsAffected =_context.Database.ExecuteSqlRaw(@"UPDATE AccountSET Age = {0}WHERE Name = {1}",22, accountForUpdate.Name);

只要我们执行这个查询,数据库中的 Age 就会变成 22

accountForUpdate 对象中的 Age 属性则不会改变,尽管它在数据库中已经被改变了。

所以,现在的问题是,如果我们想让它在执行 ExecuteSqlRaw 方法后,实体对象的值随之改变,该怎么办?。

其实很简单,我们只需要在 SQL 语句执行完成后,使用 Reload 方法重新加载这个实体即可:

_context.Entry(accountForUpdate).Reload();

小结

这篇文章主要讲了 EF Core 的原始 SQL 语句查询,下篇文章讲继续讲述 EF Core 的数据修改。

更多精彩内容,请关注我▼▼

d57f0aa5902b080818a6a69a719e0367.gif

如果喜欢我的文章,那么

在看和转发是对我最大的支持!

(戳下面蓝字阅读)

cfb043d8f4ee97c7a651363729800a5a.png

推荐关注微信公众号:码侠江湖

                        e8b9f958f0896b793d9b75c2038278ab.png觉得不错,点个在看再走哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

一、学习目标 了解图片的结构属性了解如何捕获视频了解waitkey的使用方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计…

C# WPF后台动态添加控件(经典)

概述在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本节举例介绍这个问题。这里要用到UniformGrid布局,UniformGrid 是一种横向的网格分割、…

【Envi风暴】Envi 5.4遥感影像镶嵌原来如此简单!

图像镶嵌指是在一定的数学基础控制下,把多景相邻的遥感图像拼接成一个大范围、无缝图像的过程。 Envi的图像镶嵌功能提供交互式的方式将没有地理坐标或者地理坐标的多幅图像合并,生成一幅单一的合成图像。镶嵌功能提供了透明处理、匀色、羽化等功能。 下面演示基于地理坐标(…

[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

一、学习目标 了解图片的通道与数组结构了解使用numpy创建一个图片了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的hel…

java 常用类库_JAVA(三)JAVA常用类库/JAVA IO

成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的,本身也是操作字符串的,但是与String类不同,String类的内容一旦声明之后则不可改变,改变的只是其内存地址的指向,而StringB…

Android之国际化部分文字生效而部分文字没有生效的坑

1 问题 Android国际化我们知道只要在res目录下面,创建不同国家的文件夹然后,把不同国家对于的语言以键值对的方式写进strings.xml文件就行,这是一个非常简单的操作,但是今天遇到了一个很奇葩的问题,在部分手机&#x…

【中间件】c#/.net使用GZY.Quartz.MUI搭建可视化的定时任务面板

GZY.Quartz.MUI是在github上开源的aspnetcore项目, 它旨在帮助开发人员通过面板来设置定时任务,主要想做的就是:像swaggerUI一样,项目入侵量小,仅需要在Startup中注入的UI组件官方地址:https://www.cnblogs.com/GuZhenYin/p/15745002.html主要功能1.增加本地json持久…

iOS UI基础-7.0 UIScrollView

概述 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限.当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显示过多的内容。UIScrollView是一个能…

【ArcGIS风暴】缓冲区分析、叠置分析综合实验案例:购房区域的选择

实验平台:ArcGIS 9.3实验目的:熟练掌握A rcGIS缓冲区分析和叠置分析操作,综合利用各项空间分析工具解决实际问题。实验要求:对每个条件进行缓冲区分析,运用空间叠置分析对多个图层叠加,并分等级,确定合适的区域。实验数据:ArcEx8实验步骤打开ArcMap,加载数据ArcEx8,如…

[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

一、学习目标 了解什么是色彩空间了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计算机视觉零基…

java gui 按键 数组_java GUI分配数组值

好的,所以这是一个非常基本的例子.它需要更多的工作和优化,但应该让你朝着正确的方向前进import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Shape;im…

poj1189 简单dp

http://poj.org/problem?id1189 Description 有一个三角形木板,竖直立放。上面钉着n(n1)/2颗钉子,还有(n1)个格子(当n5时如图1)。每颗钉子和周围的钉子的距离都等于d,每一个格子的宽度也都等于d,且除了最左端和最右端…

WPF|如何在 WPF 中设计漂亮的社交媒体信息仪表板

1. 效果展示先来直接欣赏效果:2. 准备创建一个WPF工程,比如站长使用 .NET 7[1] 创建名为 Dashboard3 的WPF项目,添加一些图片资源,项目目录如下:2.1 图片资源可在网站 iconfont[2] 下载 关闭、最小化 图标,…

CentOS 设置服务开机启动的方法

为什么80%的码农都做不了架构师?>>> CentOS设置服务开机启动的两种方法 1、利用 chkconfig 来配置启动级别 在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd、mysqld、postfix等,安装后系统默认不会自动启…

【ArcGIS风暴】水文分析模块实验:山脊线和山谷线提取

实验平台:ArcGIS 9.3实验目的:学习和掌握山脊线和山谷线提取的原理及方法实验要求:利用ArcGIS水文分析模块提取样区的山脊线和山谷线实验数据:Ex1实验步骤:1.正负地形的提取 (1)打开Arcmap,加载数据EX1,如图 (2)平滑处理(均值滤波)。加载Spatial Analyst模块,单击…

[python opencv 计算机视觉零基础到实战] 五、对象追踪

一、学习目标 了解为什么色彩空间的转换那么重要了解opencv中进行对象跟踪的方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python op…

【ArcGIS风暴】在ArcGIS中实现将一个圆16等分

本文实现在ArcGIS中画一个圆,然后将其16等分。 步骤一:生成圆(多边形图层) (1)创建一个点图层(图名Center),如果需要精确定位该点,建议通过输入坐标点的方式来创建,这一步比较简单,不再详述; (2)利用Buffer命令创建缓冲区(图名Circle_2km),因为要处理的对象…

[python opencv 计算机视觉零基础到实战] 六、图像运算

一、学习目标 了解opencv中图像运算的方法了解opencv中图像运算的运用 如有错误欢迎指出~ 二、了解OpenCV中图像运算的运用 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头…

【ArcGIS风暴】实验:公路建设成本的计算

实验平台:ArcGIS 9.3实验目的:学习和掌握公路建设成本的计算方法实验要求:熟练掌握如何生成通行成本层、计算成本距离,并学会计算最佳路径,且对成本距离与直线距离进行比较。实验数据:ArcEx7实验步骤:生成通行成本层1.打开Arcmap,加载数据ArcEX7,如图 2.执行spatial …

合并Spark社区代码的正确姿势

原创文章,转载请保留出处 最近刚刚忙完Spark 2.2.0的性能测试及Bug修复,社区又要发布2.1.2了,国庆期间刚好有空,过了一遍2.1.2的相关JIRA,发现有不少重要修复2.2.0也能用上,接下来需要将有用的PR合到我们内…