在使用 Entity Framework Core(简称 EF Core)进行开发时,虽然 LINQ 查询非常强大且类型安全,但在某些复杂场景下,比如需要执行存储过程、调用数据库特定函数或优化性能时,直接使用原生 SQL(Raw SQL)会更加高效灵活。本文将手把手教你如何在 EF Core 中安全、高效地执行原生 SQL 查询与命令,即使是编程小白也能轻松上手。
尽管 EF Core 提供了强大的 LINQ 支持,但以下情况更适合使用原生 SQL:
首先,确保你已安装 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;"); }} 当你希望执行 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}),而不是字符串拼接!
如果你要执行 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 注入// 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执行SQL、EF Core Raw SQL 以及 EF Core数据库操作 的实际应用!
本文由主机测评网于2025-12-04发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122973.html