EFCore——原生Sql语句(12)

一、在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}");
                }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
EF Core中,可以使用LINQ查询语法或原生SQL语句来执行数据库操作。下面分别介绍如何使用这两种方式。 1. LINQ查询语法: 使用LINQ查询语法可以通过编写类似于SQL查询的代码来执行数据库操作。以下是一些示例: ```csharp using (var context = new MyDbContext()) { // 查询所有的实体 var entities = context.MyEntities.ToList(); // 查询符合条件的实体 var filteredEntities = context.MyEntities.Where(e => e.Name == "John").ToList(); // 连接查询 var joinedEntities = from e in context.MyEntities join d in context.OtherEntities on e.Id equals d.EntityId select new { Entity = e, OtherEntity = d }; // 排序和分页 var sortedEntities = context.MyEntities.OrderBy(e => e.Name).Skip(10).Take(5).ToList(); } ``` 2. 原生SQL语句: 如果需要执行复杂的数据库操作或使用特定的SQL语句,可以使用EF Core原生SQL功能。以下是一些示例: ```csharp using (var context = new MyDbContext()) { // 执行原生SQL查询 var entities = context.MyEntities.FromSqlRaw("SELECT * FROM MyTable").ToList(); // 执行原生SQL命令 context.Database.ExecuteSqlRaw("UPDATE MyTable SET Name = 'NewName' WHERE Id = 1"); } ``` 注意:在使用原生SQL时,需要小心防止SQL注入攻击,并确保正确地处理参数化查询。 这些示例演示了如何使用LINQ查询语法和原生SQL语句来执行数据库操作。根据具体的需求,您可以选择适合的方式进行操作。如果您需要更多关于EF Core SQL语句的细节或示例,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值