当前位置: 首页 > news >正文

EF Core 执行原生SQL语句

文章目录

  • 前言
  • 一、执行查询(返回数据)
    • 1) 使用 FromSqlRaw或 FromSqlInterpolated 方法,适用于 DbSet<T>,返回实体集合。
    • 2)结合 LINQ 查询
  • 二、执行非查询操作(增删改)
    • 1)使用 ExecuteSqlRaw() 或 ExecuteSqlInterpolated() 、ExecuteSqlInterpolatedAsync()方法,返回受影响的行数。
  • 三、调用存储过程
    • 1)执行查询存储过程
    • 2)执行非查询存储过程
  • 四、事务处理
    • 1)确保多个 SQL 操作原子性
  • 五、原生 SQL 查询的注意事项
  • 总结


前言

为什么要写原生SQL语句?

  1. 尽管EF Core已经非常强大,但是任然存在着无法被写成标准EF Core调用方法的SQL语句,少数情况下任然需要写原生SQL。
  2. 存在问题:可能无法跨数据库操作。

一、执行查询(返回数据)

1) 使用 FromSqlRaw或 FromSqlInterpolated 方法,适用于 DbSet,返回实体集合。

示例:查询数据(建议使用FromSqlInterpolated,防止SQL注入

var blogs = context.Blogs
    .FromSqlRaw("SELECT * FROM Blogs WHERE Rating > {0}", 3)
    .ToList();

// 或使用插值字符串(参数化,防注入)
var rating = 3;
var blogsSafe = context.Blogs
    .FromSqlInterpolated($"SELECT * FROM Blogs WHERE Rating > {rating}")
    .ToList();

2)结合 LINQ 查询

var filteredBlogs = context.Blogs
    .FromSqlInterpolated("SELECT * FROM Blogs")
    .Where(b => b.Url.Contains("dotnet"))
    .OrderBy(b => b.Rating)
    .ToList();

二、执行非查询操作(增删改)

1)使用 ExecuteSqlRaw() 或 ExecuteSqlInterpolated() 、ExecuteSqlInterpolatedAsync()方法,返回受影响的行数。

示例:更新数据

var rowsAffected = context.Database.ExecuteSqlRaw(
    "UPDATE Blogs SET Rating = 5 WHERE Name LIKE '%EF Core%'");

// 参数化示例
var minRating = 3;
var rowsSafe = await context.Database.ExecuteSqlInterpolatedAsync(
    $"DELETE FROM Blogs WHERE Rating < {minRating}");

三、调用存储过程

1)执行查询存储过程

var blogs = context.Blogs
    .FromSqlRaw("EXEC GetTopRatedBlogs @p0", 5)
    .ToList();

2)执行非查询存储过程

context.Database.ExecuteSqlRaw("EXEC ArchiveOldBlogs @p0", DateTime.Now.AddYears(-1));

四、事务处理

1)确保多个 SQL 操作原子性

using (var transaction = context.Database.BeginTransaction())
{
    try
    {
        context.Database.ExecuteSqlRaw("UPDATE Blogs SET Rating = 5 WHERE BlogId = 1");
        context.Database.ExecuteSqlRaw("DELETE FROM Blogs WHERE BlogId = 2");
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}

五、原生 SQL 查询的注意事项

  1. 参数化查询:始终使用参数化输入(如 {0} 或插值语法)避免 SQL 注入。
  2. 列匹配:查询返回的列名必须与实体属性名匹配,或通过 AS 别名映射。
  3. 跟踪变更:默认跟踪实体变更,若无需跟踪可加 .AsNoTracking()。
  4. 数据库兼容性:SQL 语法需适配具体数据库(如 SQL Server 和 SQLite 的差异)。
  5. 性能:仅在必要时使用原生 SQL,优先选择 LINQ 以保证类型安全和可维护性。

总结

EF Core 的原生 SQL 方法适用于特定场景,但需谨慎使用以确保安全性和可维护性。优先考虑 LINQ,复杂场景再选择原生 SQL。

相关文章:

  • 大模型应用平台架构
  • Android 12系统源码_系统启动(二)Zygote进程
  • 批量处理word里面表格单元格中多余的回车符
  • JavaScrip-模版字符串的详解
  • 文献学习:单细胞+临床+模型构建 | 一篇Molecular Cancer文献如何完整解读CDK4/6i耐药机制
  • http 和 https
  • 《云原生安全攻防》-- K8s容器安全:使用gVisor构建安全沙箱运行环境
  • 阶段三:高级特性
  • 50.topodijkstra
  • Python Grpc安装protoc-gen-js并执行 grpc-web生成py文件
  • 【翻译】OmniSQL——大规模生成高质量文本转SQL数据
  • 002射影几何
  • 力扣刷题79. 单词搜索
  • 基于MCU实现的电机转速精确控制方案:软件设计与实现
  • 电机控制常见面试问题(二十)
  • 推荐一款好看的 vue3 后台模板
  • 《STL 六大组件之容器探秘:深入剖析 vector》
  • Python | 计算散度
  • TF-IDF算法
  • scss预处理器对比css的优点以及基本的使用
  • 政府网站建设要求/有哪些推广平台和渠道
  • 大连 网站建设 有限公司/优化seo
  • 网站变灰/推广普通话手抄报内容怎么写
  • 北沙滩网站建设/重庆关键词优化服务
  • 大网站制作公司/seo刷词
  • 上海建溧建设集团有限公司网站/瑞昌网络推广