我们知道,程序都是要通过SQL语句与关系数据库进行交互的。
在使用EF Core的时候,一般不需要再去编写SQL语句,这是因为EF Core会把C#代码转换成与SQL语句相关的操作。
在日常开发中,只要编写C#代码对实体类进行操作就可以了,不需要时刻关注代码生成的SQL语句是什么样的。
但是开发人员仍然有查看底层SQL语句的需求。
比如在程序出现性能问题的时候,开发人员需要检查EF Core生成的SQL语句是否有性能缺陷;
比如在程序出现Bug的时候,开发人员需要检查EF Core生成的SQL语句是否和自己预期的一致。
1. 使用简单日志查看SQL语句
在EF Core5.0之前,我们需要使用标准的日志框架输出EF Core背后执行的SQL语句。
而从EF Core 5.0 开始,EF Core增加了一种”简单日志”,在不引入.NET的日志框架的情况下,我们就能得到程序执行的SQL语句。
我们只要在上下文的OnConfiguring方法中调用optionsBuilder类的LogTo方法,传递一个参数为String的委托即可。
当相关日志输出的时候,对应的委托就会被执行。
C#
optionsBuilder.LogTo(Console.WriteLine);
这样我们就可以把包含底层执行的SQL语句在内的EF Core的日志输出到控制台
输出结果:

2. 探秘EF Core生成SQL语句的不同
我们知道,EF Core会把C#语句翻译成SQL语句。
不同数据库的语法以及支持的函数是有一些差别的,比如SQL Sever中获取前3条数据的语法是TOP,而MySQL中则是LIMIT,Oracle中则是ROWNUM。
同样的C#语句会被EF Core翻译成不同数据库中的不同SQL语句,这样EF Core把底层数据库方言的差异性屏蔽起来,开发人员只要专注编写C#代码即可。