EntityFramework Core Raw SQL
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,EntityFramework Core Raw SQL基础查询(执行SQL和存储过程)啥也不说了,拿起键盘就是干,如下: public class HomeController : Contr
千家信息网最后更新 2025年01月21日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安全错误
数据库的锁怎样保障安全
英雄联盟手游换个服务器图片
软件开发过程特性
邯郸电脑软件开发哪家便宜
服务器托管 网络安全
游戏软件开发工程师工资
网络安全的重要性演讲稿
北京网络技术开发常见问题
怎么自动化检测服务器运行状态
青少年网络安全主题团日活动
读取mysql数据库代码
移动终端服务器管理与配置
战地4有些服务器卡
国泰安数据库是否st
b站dns服务器不可用
与客户交谈后 网络技术人员
网吧服务器开关电源
网络安全普及的目标
聚橙网网络技术耿军
软件开发项目概算标准
山西定制化服务器
c#保存查询结果到数据库
邯郸电脑软件开发哪家便宜
服务器无盘镜像
安装vb6后导致数据库连接失败
浪潮服务器管理口安装系统
网络技术人员的基本要求
数据库查询数量超过100的语句
协会服务网络安全企业
软件开发安卓ios
国内网络安全政策