EFCore——原生Sql语句(12)
原生Sql语句
一、在EFCore的体系下执行原生SQL
1.执行查询原生sql(FromSqlInterpolated)
2.执行非查询sql(ExecuteSqlInterpolatedAsync)
二、使用ADO.NET体系下执行纯原生SQL
1.为什么使用ADO.NET
2.ADO.NET举例
一、在EFCore的体系下执行原生SQL
1.执行查询原生sql(FromSqlInterpolated)
1.在EFCore体系执行SQL有很大的限制,但较为方便
2.执行原生查询Sql语句
//使用了插值函数,Article表名, var list = await ctx.Articles.FromSqlInterpolated(@$"select * from T_Articles").ToListAsync();
3.执行原生Sql语句我们可以使用FromSqlInterpolated去执行,而分页,include,过滤,排序依旧可以找EFCore实现
var list = await ctx.Articles.FromSqlInterpolated(@$"select Id,Title,Message from T_Articles").Include(b=>b.Comments).ToListAsync();
4.FromSqlInterpolated执行原生Sql只能查找全部列,不能只查找部分列
这是FromSqlInterpolated的局限性,只能单表查询,不能使用join例:
2.执行非查询sql(ExecuteSqlInterpolatedAsync)
1.执行非查询原生查询Sql语句
例:删除
await ctx.Database.ExecuteSqlInterpolatedAsync(@$" DELETE FROM T_Articles WHERE id =13");
插入
await ctx.Database.ExecuteSqlInterpolatedAsync(@$"insert into T_Articles (Title,Message) values( 'LTY','毕业了')");
在EFCore执行原生Sql有局限性,应付不了复杂的情况,那么可以使用接下里的最朴素的方式。
二、使用ADO.NET体系下执行纯原生SQL
1.为什么使用ADO.NET
1.FromSqlInterpolated()只能单表查询,但在实现报表查询,Sql语句非常复杂,不仅要多表join,而且返回的查询结果不与实体对应。不能用它来查询,因此需要一种能执行任意Sql查询的机制。
例:就没对应实体,就不能用FromSqlInterpolated
select Author,Count(*)from T_Books group by Author
2.EFCore允许把视图或存储过程映射为实体,因此可以把复杂查询写出视图或存储过程,然后再声明对应的实体。并且要DbSet
//复杂查询 select Author,Count(*)from T_Books group by Author //需要搞一些这些不对应表的实体,这些不是实体,但在代码层面上它又是实体,会非常恶心 class BookAuthor { public string Author{get;set;} public int Count{get;set;} }
3.不推荐写视图,存储;导致视图太多;非实体的DbSet;DbSet膨胀,不好维护。当遇到这种复杂查
询的时候建议是用Ado.Net;
2.ADO.NET举例
1.原生ADO.NET
这里举一个小例子,Ado自行学习
//拿到DbContext对应的底层Connection,就是由原先EFCore调Ado,变成跳过EF直接调Ado。 //且不需要进行释放,由DbContext释放掉。因此因此只要释放Command就行 DbConnection conn = ctx.Database.GetDbConnection(); if (conn.State != System.Data.ConnectionState.Open) { //判断没有打开就进行打开。 await conn.OpenAsync(); } using (var cmd = conn.CreateCommand()) { #region 删除 //删除 cmd.CommandText = "DELETE FROM T_Comments WHERE id = 7;"; using (var reader = await cmd.ExecuteReaderAsync()) { } #endregion #region 查询 //要执行的Sql cmd.CommandText = "select Price,Count(*) from T_Articles group by price"; //执行sql using (var reader = await cmd.ExecuteReaderAsync()) { //打印 while (await reader.ReadAsync()) { double price = reader.GetDouble(0); int count = reader.GetInt32(1); Console.WriteLine($"Price{price},Count{count}"); } } #endregion }
2.Dapper
//用到的Nuget包 Install-Package Dapper -Version 2.0.123
1.dapper是一个轻量级的orm,功能没有EFCore多,但更加容易上手,比EFCore灵活写
2.相比ADO.NET,dapper是对上面使用到的ADO.NET操作的简单封装,纯写ADO.NET,Sql效率低,比较痛苦
3.举例
//dapper就是将执行的sql,对Ado封装成IEnumber var items = ctx.Database.GetDbConnection().Query<GroupArticleByPrice>("select Price,Count(*) Count from T_Articles group by price"); foreach(var item in items) { Console.WriteLine($"Price{item.Price},Count{item.Count}"); }
转 https://blog.csdn.net/wsnbbdbbdbbdbb/article/details/122391455
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)