当前位置:首页 > C# > 正文

EF Core原生SQL查询与执行(全面掌握Entity Framework Core中Raw SQL的使用方法)

在使用 Entity Framework Core(简称 EF Core)进行开发时,虽然 LINQ 查询非常强大且类型安全,但在某些复杂场景下,比如需要执行存储过程、调用数据库特定函数或优化性能时,直接使用原生 SQL(Raw SQL)会更加高效灵活。本文将手把手教你如何在 EF Core 中安全、高效地执行原生 SQL 查询与命令,即使是编程小白也能轻松上手。

EF Core原生SQL查询与执行(全面掌握Entity Framework Core中Raw SQL的使用方法) Core原生SQL查询 Entity Core执行SQL Core Raw SQL Core数据库操作 第1张

一、为什么需要使用原生 SQL?

尽管 EF Core 提供了强大的 LINQ 支持,但以下情况更适合使用原生 SQL:

  • 执行复杂的报表查询(如多表连接、窗口函数等)
  • 调用数据库特定功能(如 PostgreSQL 的 JSONB 查询)
  • 批量更新或删除(避免加载大量实体到内存)
  • 调用存储过程

二、准备工作:创建 DbContext 和模型

首先,确保你已安装 EF Core 包,并定义好模型和 DbContext。例如:

public class Product{    public int Id { get; set; }    public string Name { get; set; } = string.Empty;    public decimal Price { get; set; }}public class AppDbContext : DbContext{    public DbSet<Product> Products { get; set; }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=TestDb;Trusted_Connection=true;");    }}

三、使用 FromSqlRaw 执行查询并返回实体

当你希望执行 SELECT 语句并映射到实体类时,可以使用 FromSqlRaw 方法。这是 EF Core 原生 SQL 查询中最常用的方式之一。

using var context = new AppDbContext();var products = context.Products    .FromSqlRaw("SELECT * FROM Products WHERE Price > {0}", 100)    .ToList();

⚠️ 注意:为了防止 SQL 注入,请始终使用参数化查询(如上面的 {0}),而不是字符串拼接!

四、使用 ExecuteSqlRaw 执行非查询命令

如果你要执行 INSERT、UPDATE、DELETE 或调用存储过程等不返回数据的操作,应使用 ExecuteSqlRaw(EF Core 5+)或 ExecuteSqlInterpolated

// 批量更新价格int rowsAffected = context.Database    .ExecuteSqlRaw("UPDATE Products SET Price = Price * {0} WHERE Category = {1}", 1.1m, "Electronics");Console.WriteLine($"更新了 {rowsAffected} 行数据。");

五、执行存储过程

假设数据库中有一个名为 GetProductsByCategory 的存储过程,你可以这样调用:

var category = "Books";var products = context.Products    .FromSqlRaw("EXEC GetProductsByCategory {0}", category)    .ToList();

六、安全提示:防止 SQL 注入

永远不要拼接用户输入到 SQL 字符串中!正确做法是使用参数化查询:

// ❌ 危险!可能导致 SQL 注入// var sql = $"SELECT * FROM Products WHERE Name = '{userInput}'";// ✅ 安全!使用参数化查询var products = context.Products    .FromSqlRaw("SELECT * FROM Products WHERE Name = {0}", userInput)    .ToList();

七、总结

通过本文,你已经掌握了在 EF Core 中执行原生 SQL 查询与命令的核心方法。无论是使用 FromSqlRaw 获取实体数据,还是用 ExecuteSqlRaw 执行更新操作,只要注意参数化查询的安全性,就能在保持代码简洁的同时发挥数据库的最大性能。

记住,EF Core 原生 SQL 查询是 LINQ 的有力补充,而非替代。合理结合两者,才能构建出高效、安全、可维护的数据访问层。

希望这篇教程能帮助你更好地理解 EF Core原生SQL查询Entity Framework Core执行SQLEF Core Raw SQL 以及 EF Core数据库操作 的实际应用!