EF Core如何执行原生SQL查询 EF Core FromSqlRaw使用方法
技术百科
月夜之吻
发布时间:2026-01-16
浏览: 次 EF Core 执行原生 SQL 查询主要使用 FromSqlRaw 和 FromSqlInterpolated,仅适用于 DbSet 且返回对应实体类型;非查询操作用 ExecuteSqlRaw,复杂结果需配合 SqlQueryRaw 或 ADO.NET。
EF Core 执行原生 SQL 查询主要靠 FromSqlRaw(以及安全增强版 FromSqlInterpolated),它适用于需要精细控制 SQL、调用存储过程、或处理复杂查询但 LINQ 难以表达的场景。
FromSqlRaw 基本用法(需配合 DbSet)
它只能用于 DbSet,且返回类型必须是该 DbSet 对应的实体类型(或其可映射的基类/接口)。不能直接返回匿名对象或自定义 DTO —— 若需灵活结果,请改用 Database.ExecuteSqlRaw 或 Database.GetDbConnection() 配合 ADO.NET。
- 写法示例:
var blogs = context.Blogs.FromSqlRaw("SELECT * FROM Blogs WHERE Id > {0}", 10).ToList(); - 注意:SQL 字符串必须以
SELECT开头,EF Core 才能将其映射为实体集合;若执行 INSERT/UPDATE/DELETE,请用ExecuteSqlRaw - 不支持多语句(如
"SELECT ...; SELECT ..."),也不支持非查询语句混在FromSqlRaw中
防止 SQL 注入:优先用 FromSqlInterpolated
FromSqlInterpolated 是带插值语法的安全替代方案,自动参数化所有 $"" 内的变量,避免手拼字符串出错。
- 正确写法:
var minId = 5;
var blogs = context.Blogs.FromSqlInterpolated($"SELECT * FROM Blogs WHERE Id >= {minId}").ToList(); - 变量会被转为命名参数(如
@p0),底层走 ADO.NET 参数化,彻底规避注入风险 - 只接受单个插值字符串,不支持拼接多个字符串再传入
配合 AsNoTracking 提升只读查询性能
原生 SQL 查询默认仍会跟踪实体状态。如果只是读取展示数据,加上 AsNoTracking() 可显著减少内存和性能开销。
- 推荐组合:
var blogs = context.Blogs
.FromSqlInterpolated($"SELECT * FROM Blogs WHERE CreatedAt > {DateTime.Today.AddDays(-7)}")
.AsNoTracking()
.ToList(); - 尤其适合报表、后台列表、API 只读接口等场景
调用存储过程与复杂结果映射
可以调用存储过程,但返回列名和类型必须与实体属性严格匹配(大小写不敏感,但字段数、名称、可空性要一致)。
- 示例(SQL Server):
var users = context.Users
.FromSqlRaw("EXEC GetActiveUsers @p0", DateTime.Now.AddMonths(-1))
.ToList(); - 若存储过程返回字段与实体不一致,可新建一个匹配的
DbSet(需配置为无键实体或使用查询类型),或改用context.Database.SqlQueryRaw(EF Core 5+)() - 注意:存储过程中不能有临时表、SET 语句干扰结果集结构,否则映射可能失败
基本上就这些。FromSqlRaw / Interpolated 是 EF Core 对接原生能力的关键入口,用对了既保持 ORM 便利性,又不失 SQL 灵活性 —— 关键是分清“查实体”还是“做操作”,别把增删改塞进 FromSqlRaw,也别指望它返回任意结构数据。
# 将其
# 也不
# 多个
# 又不
# 适用于
# 自定义
# 能有
# 不支持
# 对象
# 字符串
# 接口
# .net
# var
# delete
# select
# sql
# linq
# database
# 插值
# 存储过程
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- 用lighttpd能运行php吗_lighttpd
- 如何在Golang中实现服务熔断与限流_Golan
- Windows如何使用注册表查找和删除项?(reg
- 如何用::实现单例模式_php静态方法与作用域操作
- Windows10如何更改任务栏高度_Win10解
- Win11怎么关闭SmartScreen_禁用Wi
- 如何使用Golang读取日志文件_Golang b
- php删除数据怎么清空表_truncate与del
- C++如何获取CPU核心数?(std::threa
- Win11关机界面怎么改_Win11自定义关机画面
- Win11怎么设置单手模式_Win11触控键盘布局
- Win10系统映像怎么恢复 Win10使用系统映像
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Windows10蓝屏SYSTEM_SERVICE
- Windows系统被恶意软件破坏后的恢复策略_错误
- 如何将竖排文本文件转换为横排字符串
- PHP主流架构如何做单元测试_工具与流程【详解】
- Win11怎么设置虚拟内存_Windows 11优
- Win11怎么更改鼠标指针_Windows 11自
- Win11怎么关闭透明效果_Windows11个性
- Win11如何设置计划任务 Win11定时执行程序
- php条件判断怎么写_ifelse和switchc
- 如何在Golang中实现邮件发送功能_Golang
- php8.4新语法match怎么用_php8.4m
- Win11怎么看电池循环次数_Win11笔记本电池
- Win11怎么设置触控板手势_Windows11三
- c++中如何使用虚函数实现多态_c++多态性实现原
- Win11怎么更改任务栏颜色_Windows11个
- C++中的Pimpl idiom是什么,有什么好处
- Win11开机速度慢怎么优化_Win11系统启动加
- Linux怎么修改用户密码_Linux系统pass
- 如何使用Golang搭建本地API测试环境_快速验
- php后缀怎么变mp4能播放_让php伪装mp4正
- 如何使用Golang实现微服务事件驱动_使用消息总
- php本地部署后数据库连接报错_1045acces
- Windows11怎么用“记事本”自动换行与编码
- Win11怎么关闭定位服务_保护Win11位置隐私
- Win11此电脑不在桌面上_Windows 11桌
- PHP主流架构如何处理会话管理_Session与C
- Python文件操作优化_大文件与流处理解析【教程
- Win11怎么开启HDR模式_Windows 11
- Windows蓝屏错误0x0000002C怎么解决
- php增删改查报错1054怎么办_字段名错误排查修
- Win11怎么更改计算机名_Windows11系统
- Golang如何避免指针逃逸_Golang逃逸分析
- php高频调试功能有哪些_php常用调试函数与工具
- Win10如何更改网络连接_Windows10以太
- Win11如何设置环境变量 Win11添加和修改系
- Win11右键反应慢怎么办 Win11优化右键菜单


QQ客服