EntityFramework Core Raw SQL
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,EntityFramework Core Raw SQL基础查询(执行SQL和存储过程)啥也不说了,拿起键盘就是干,如下: public class HomeController : Contr
千家信息网最后更新 2026年10月31日EntityFramework Core Raw SQL
EntityFramework Core Raw SQL
基础查询(执行SQL和存储过程)
啥也不说了,拿起键盘就是干,如下:
public class HomeController : Controller { private IBlogRepository _blogRepository; public HomeController(IBlogRepository blogRepository) { _blogRepository = blogRepository; } public IActionResult Index() { var list = _blogRepository.GetList(); return Ok(); } }public class BlogRepository : EntityBaseRepository, IBlogRepository { private EFCoreContext _efCoreContext; public BlogRepository(EFCoreContext efCoreContext) : base(efCoreContext) { _efCoreContext = efCoreContext; } public IEnumerable GetList() { var iQueryTable = _efCoreContext.Set (). FromSql("select * from Blog"); return iQueryTable.ToList(); } }
下面我们来看看存储过程。
CREATE PROCEDURE dbo.GetBlogListASBEGIN SELECT * FROM dbo.BlogENDGO
public IEnumerableGetList() { var iQueryTable = _efCoreContext.Set (). FromSql("EXECUTE dbo.GetBlogList"); return iQueryTable.ToList(); }
参数查询
利用参数化存储过程查询。
* FROM dbo.Blog WHERE Id =
结果利用FromSql就变成了如下:
public IEnumerableGetList() { var Id = new SqlParameter("Id", "1"); var iQueryTable = _efCoreContext.Set (). FromSql("EXEC dbo.GetBlogList {0}", 1); return iQueryTable.ToList(); }
上述是利用string.format的形式来传参,我们也可以利用SqlParameter来传参,如下:
public IEnumerableGetList() { var Id = new SqlParameter("Id", "1"); var iQueryTable = _efCoreContext.Set (). FromSql("EXEC dbo.GetBlogList @id", Id); return iQueryTable.ToList(); }
我们通过开启调试,可以清晰看到执行的存储过程。
通过如上我们知道参数化查询有两种形式,下面我们再来看看linq查询。
linq查询
上述我们演示一直直接使用FromSql,其实在此之后我们可以继续通过linq来进行查询,如下:
public IEnumerableGetList() { var Id = new SqlParameter("Id", "2"); var iQueryTable = _efCoreContext.Set (). FromSql("EXEC dbo.GetBlogList @id", Id).Where(d => d.Name == "efcore2"); return iQueryTable.ToList(); }
之前我们映射了Blog和Post之间的关系,这里我们只能查询出Blog表的数据,通过对上述linq的讲解,我们完全可以通过inlcude来显式加载Post表数据,如下:
public IEnumerableGetList() { var Id = new SqlParameter("Id", "2"); var iQueryTable = _efCoreContext.Set (). FromSql("EXEC dbo.GetBlogList @id", Id).Include(d => d.Posts); return iQueryTable.ToList(); }
好吧,明确告诉我们对于存储过程是不支持Inlude操作的,所以要想Include我们只能进行简单的查询,如下:
public IEnumerableGetList() { var iQueryTable = _efCoreContext.Set (). FromSql("select * from blog").Include(d => d.Posts); return iQueryTable.ToList(); }
查找官网资料时发现居然对表值函数(TVF)是可以Include的,创建内嵌表值函数如下:
USE [EFCoreDb]GOIF OBJECT_ID('dbo.GetBlog') IS NOT NULL DROP FUNCTION dbo.GetBlog;GOCREATE FUNCTION dbo.GetBlog (@Name VARCHAR(max)) RETURNS TABLE WITH SCHEMABINDINGAS RETURN SELECT Id, Name, Url FROM dbo.Blog WHERE Name = @NameGO调用如下:
public IEnumerableGetList() { var name = "efcore2"; var iQueryTable = _efCoreContext.Set (). FromSql("select * from [dbo].[GetBlog] {0}", name).Include(d => d.Posts); return iQueryTable.ToList(); }
结果出乎意料的出现语法错误:
通过SQL Server Profiler查看发送的SQL语句如下:
这能不错么,官网给的示例也是和上述一样,如下:
只是按照和他一样的搬过来了,未曾想太多,还是粗心大意了,想了好一会,按照我们正常调用表值函数即可,我们需要用括号括起来才行,如下:
public IEnumerableGetList() { var name = "efcore2"; var iQueryTable = _efCoreContext.Set (). FromSql("select * from [dbo].[GetBlog] ({0})", name).Include(d => d.Posts); return iQueryTable.ToList(); }
上述将[dbo.GetBlog]和({0})隔开和挨着都可以。这个时候才不会出现语法错误。执行的SQL如下才是正确的。
好了,到了这里关于EF Core中原始查询我们就告一段落了,其中还有一个知识点未谈及到,在EF Core我们可以直接通过底层的ADO.NET来进行查询,我们来看下:
底层ADO.NET查询
public IEnumerableGetList() { var list = new List (); using (var connection = _efCoreContext.Database.GetDbConnection()) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "SELECT * FROM dbo.Blog"; using (SqlDataReader reader = command.ExecuteReader() as SqlDataReader) { while (reader.Read()) { var blog = new Blog(); blog.Id = Convert.ToInt32(reader["Id"]); blog.Name = reader["Name"].ToString(); blog.Url = reader["Url"].ToString(); list.Add(blog); } } } } return list; }
查询
过程
存储
函数
参数
底层
形式
数据
结果
语法
错误
不错
原始
粗心
粗心大意
出乎意料
之间
只是
可以通过
告一段落
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网与科技
科技互联网政务服务
互联网与科技金融数据
麻工互联网科技
与互联网科技公司
互联网络科技有限公司
狮子座互联网科技
奇酷互联网科技
互联网科技大会
互联网科技创新企业排名
互联网科技公司招聘
济南和联互联网科技有限公司
农村开互联网科技讲堂
团飞科技与伯堂互联网服务平台
玉溪互联网科技怎么选
成都互联网科技公司工作好不好
工业互联网山东科技大学
互联网科技包装股
湖北辰鑫科技互联网
科技和互联网行业的特点
高科技与互联网
丰台科技园 互联网
深圳天众互联网科技公司
兼蜜互联网科技
互联网金融科技委员会
互联网科技博主是什么意思
港股科技和互联网
西安小鹰速贷互联网科技有限公司
无锡工业互联网科技有限公司
启辰互联网科技