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

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

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

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

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

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

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

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 的数据修改。

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

如果喜欢我的文章,那么

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

(戳下面蓝字阅读)
  • ASP.NET 6 中间件系列

  • ASP.NET 最通俗易懂的依赖注入系列

  • 查缺补漏系统学习 EF Core 6  系列

  • 老子不亏是程序员的祖师爷

  • 不得不知的超精简 HTTP 协议

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

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

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

  1. 查缺补漏系统学习 EF Core 6 - 批量操作

    推荐关注「码侠江湖」加星标,时刻不忘江湖事 这是 EF Core 系列的第七篇文章,上一篇文章讲述了 EF Core 中的实体数据修改. 这篇文章讲一讲 EF Core 如何进行批量操作. 在众多的 ...

  2. 查缺补漏系统学习 EF Core 6 - 数据查询

    这是 EF Core 系列的第四篇文章,上一篇文章讲述了 EF Core 中的实体迁移与数据播种. 这篇文章盘点一下 EF Core 的几种数据查询方式,内容较多分上下两篇. 点击上方或后方蓝字,阅读 ...

  3. 查缺补漏系统学习 EF Core 6 - 软删除与编译查询

    这是 EF Core 系列的第八篇,也是系列的最后两篇章节,所以就讲一讲 EF Core 的一些扩展知识:软删除.显式编译查询.IQueryable 和 IEnumerable. 这篇文章就先说一说软 ...

  4. I2C总线学习—查缺补漏—S3C2440的I2C控制器

    I2C总线学习-查缺补漏-S3C2440的I2C控制器                  学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440 ...

  5. I2C总线学习—查缺补漏—应答信号ACK

    I2C总线学习-查缺补漏-应答信号ACK           IIC协议规定,当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备(从设备)标识数据传送结束.这是因为每次传输都应得到应答信号后 ...

  6. I2C总线学习—查缺补漏—对数据有效性的思考

    I2C总线学习-查缺补漏-对数据有效性的思考 IIC协议规定:SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化.IIC期间在脉冲上升沿把数据放到SDA上, ...

  7. EFCore查缺补漏(二):查询

    相关文章: EFCore查缺补漏 第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single q ...

  8. 赫斌老师数据结构视频查缺补漏笔记

    赫斌老师数据结构视频查缺补漏笔记 观看学习赫斌老师数据结构的视频,记录下自己之前学习这块内容时似懂非懂的知识,仅针对自己查缺补漏使用 视频链接:<郝斌老师数据结构自学视频> 1.指针的大小 ...

  9. 「查缺补漏」高频考点浏览器面试题

    前言 想要成为一名合格的前端工程师,掌握相关浏览器的工作原理是必备的,这样子才会有一个完整知识体系,要是「能参透浏览器的工作原理,你就能解决80%的前端难题」. 这篇梳理的话,更多的是对浏览器工作原理 ...

最新文章

  1. PHP feof() 函数读文件的使用
  2. 是否可以人为修改发表时间
  3. ASP.NET设置ie打印两法 (精)(转)
  4. Linux 数据流重定向
  5. java严格模式_“use strict” 严格模式使用(前端基础系列)
  6. Spring Boot 开源软件都有哪些?
  7. 【Flink】Flink SQL 一个流 输出 2 次
  8. Windows直接获取文件的哈希值
  9. mui刷新不显示动画_144Hz刷新率和60Hz有啥区别?体验有何不同?这里全告诉你
  10. 唐骏:毕业5年决定你的命运
  11. 一个资深系统管理员的O2O实践(引子)
  12. Tungsten Replicator
  13. wamp5多站点配置教程
  14. 极米H5值得入手吗?极米H5实际体验如何?画面对比实测
  15. Linux错误:bash:finger 未找到命令...
  16. SPI读取NRF24L01
  17. Windows XP下如何实现共享上网
  18. JAVA 接口 验证哥特巴赫猜想
  19. 异常状态及发生率计算
  20. 画饼画到世界地图上:按比例呈现多组数据

热门文章

  1. 通达信下单程序dll接口怎么样去搭建?
  2. 02-Spring WebFlux Flux和Mono构建响应式数据流
  3. 【WPF】UI元素--《深入浅出WPF》by刘铁锰
  4. 完美通行证身份证号格式_使用通行证js进行节点js身份验证
  5. 用友NC6.5 Linux服务器环境部署
  6. 人脸关键点检测和头部姿态估计数据集整理
  7. Tomcat6w.exe 运行 提示 指定的服务未安装 unable to open the service 'tomcat6'解决方案
  8. 是挑战刘谦的权威吗?
  9. 手机浏览器Cookie保存不上的问题
  10. (附源码)计算机毕业设计ssm大学请假管理系统