EntityFramework Core Raw SQL
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,EntityFramework Core Raw SQL基础查询(执行SQL和存储过程)啥也不说了,拿起键盘就是干,如下: public class HomeController : Contr
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
rust直接连接服务器代码
5g网络安全的思考
如何向服务器传送文件
数据库第三方连不上
qq飞车赛车数据库神影
网络安全学生心得体会600字
杭州他山网络技术有限公司电话
数据库安全指标
服务器网址怎样安装
外汇交易网络技术
如何用数据库连接电脑上网
ctf网络安全大赛团队
数据库作品下载地址
网络安全专家怎么培养
网络安全法的个人信息是哪些
飞行安全精度数据库更新
sql2005数据库补丁
杭州地铁软件开发岗
学校网络安全签名活动
农业工程数据库
巫溪县软件开发培训
谈剑锋网络安全演讲完整视频
检查异常数据库
虹口区提供网络技术创造辉煌
网络安全漫画100张
网络安全 知识点
oracle数据库填什么
数据库 元关系
铜陵软件开发要多少钱
node数据库映射框架