当前位置: 首页 > article >正文

第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 t
      WHERE t."Age" > 3
      LIMIT @__p_0
旺旺
财旺
大黄

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


http://www.kler.cn/a/563442.html

相关文章:

  • C# 单元测试 xUnit、NUnit 与 MTest
  • SOC-ATF 安全启动BL1流程分析(1)
  • 【课堂笔记】线性回归梯度下降的矩阵求导推导
  • redis-bitmap使用场景
  • Nacos + Dubbo3 实现微服务的Rpc调用
  • Vue组件间通信的方式
  • 毕业项目推荐:基于yolov8/yolo11的苹果叶片病害检测识别系统(python+卷积神经网络)
  • angular舒尔特方格
  • 医院HIS接入大模型:算力基础设施与训练能力的深度剖析与测算
  • Docker基础-常见命令
  • 面试之《react中,fiber更新时,怎么判断fiber是否应该在当前idle内执行》
  • osgEarth安装总结
  • 将夸克网盘的webdav挂载成本地磁盘驱动器时报错“405“
  • 学习汇编前置知识第二天
  • nginx代理后502
  • seacmsv9 SQL注入漏洞
  • DFS:二叉树的深搜与回溯
  • 冒泡排序(Bubble Sort)详细教程:Java实现与优化
  • Python使用列表实现栈、队列学习记录
  • 【C++修炼之路】C++类与对象:面向对象编程的第一步