欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 第4章 4.5 查看EF Core生成的SQL语句

第4章 4.5 查看EF Core生成的SQL语句

2025/4/26 16:31:52 来源:https://blog.csdn.net/weixin_46540714/article/details/145869889  浏览:    关键词:第4章 4.5 查看EF Core生成的SQL语句

查看EF Core生成的SQL语句,就是在扒EF Core的底裤。是为了让开发者能够洞察SQL语句是否有性能缺陷或者是否和自己预期的一致。

4.5.1 使用简单日志查看SQL语句

这是视频教程里讲的一种:好像收费版的SQLServer才能用这个功能

还讲了一种:标准日志的方式

又讲了一种:

从5.0版本以后,可以通过简单日志的方式查看程序执行的SQL语句。具体方式就是在OnConfiguring方法中调用optionBuilder类的LogTo方法。

代码如下:

这样,在程序运行时就可以看到SQL语句了

4.5.2 探秘EF Core 生成SQL语句的不同

 EF Core支持多种数据库的应用,但是由于各个数据库的语法特性存在差异,因此在不同的数据库环境下使用EF Core生成的SQL语句会存在一定差异。

例如书中提到的获取前三条数据的语法,下列三种数据库对应的语法都不相同:

下面实际操作对比一下

1. SQLServer

应用之前已创建好的数据库:

在项目中查询年龄大于3且前三条数据

using (EFCoreDbContext dbCon = new EFCoreDbContext())
{var data = dbCon.Dogs.Where(d => d.Age > 3).Take(3);Thread.Sleep(3000);foreach (var item in data){Console.WriteLine(item.Name);}
}

控制台执行结果:

info: 2025/2/24 10:52:46.488 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)Executed DbCommand (33ms) [Parameters=[@__p_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']SELECT TOP(@__p_0) [t].[ID], [t].[Age], [t].[Name], [t].[Number]FROM [T_Dogs] AS [t]WHERE [t].[Age] > 3
旺旺
财旺
大黄

2. PostgreSQL

EF Core框架连PostgreSQL需要安装的NuGet包是:

Npgsql.EntityFrameworkCore.PostgreSQL

连接PGSQL的配置:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{string connStr = "Host=127.0.0.1;DataBase=EFStudy;Username=postgres;Password=123caonimaCAONIMA";//TrustServerCertificate=True User ID=sa;Password=123caonimaCAONIMA;optionsBuilder.UseNpgsql(connStr);optionsBuilder.LogTo(sqlLog => {if(!sqlLog.Contains("CommandExecuted")){return;}Console.WriteLine(sqlLog); });
}

框架搭建详细过程就不再赘述了,直接上查询代码:

using (EFCoreDbContext dbCon = new EFCoreDbContext())
{var data = dbCon.Dogs.Where(d => d.Age > 3).Take(3);Thread.Sleep(3000);foreach (var item in data){Console.WriteLine(item.Name);}
}

控制台执行结果:

info: 2025/2/24 14:22:04.450 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)Executed DbCommand (46ms) [Parameters=[@__p_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']SELECT t."ID", t."Age", t."Name", t."Number"FROM "T_Dogs" AS tWHERE t."Age" > 3LIMIT @__p_0
旺旺
财旺
大黄

由两种数据库操作的执行过程来看,同样的业务逻辑的代码,在面对不同种类的数据库的情况下,生成的SQL语句存在差异。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词