使用EFCore框架,虽然我们写的是c#的语句,其实背后还是转换成了数据库可以执行的SQL。这一转换操作由EFCore框架执行。虽然使用EFCore框架我们更多的精力关注c#即可,但是要想真正了解EFCore的执行情况,还是需要查看框架转换后的SQL语句。这里记录三种查看方式:
以下代码示例和操作基于上一节创建的控制台应用程序进行演示。上一节的项目代码地址:
EFCore-6 反向工程
标准日志
1.项目中引用控制台打印的程序集(这里只是输出到控制台,所以引用此程序集,如果要以其他方式输出,则自行查阅资料)。
Install-Package Microsoft.Extensions.Logging.Console
2.在Context文件中调用日志组件
private static ILoggerFactory loggerFactory = LoggerFactory.Create(b => b.AddConsole());
optionsBuilder.UseLoggerFactory(loggerFactory);
3.写查询语句,并打印查询的结果
Program.cs的代码:
using System;
using System.Linq;
namespace DbFirstDemo
{
class Program
{
static void Main(string[] args)
{
using (testdbhrContext ctx = new testdbhrContext())
{
var person = ctx.TPeople.Where(b => b.Name == "zhangsan");
foreach (var item in person)
{
Console.WriteLine(item.Name);
}
}
}
}
}
4.控制台输出SQL
简单日志
在Context文件中调用日志组件
optionsBuilder.LogTo(msg => {
Console.WriteLine(msg);
});
该方法打印的日志信息很全,不仅有SQL信息,还包含了EFCore的执行过程信息。
如果只想打印出SQL信息,可以加上判断条件。
执行结果:
这样就过滤了其他的信息,方便查看SQL内容。
ToQueryString方法记录日志
引用程序集,并调用IQueryable的ToQueryString方法。
using Microsoft.EntityFrameworkCore;
string sql = person.ToQueryString();
执行结果:
该方法获取到SQL有两个特点:
a.其实并没有真正执行查询,仅仅获取到了查询的SQL语句。
b.只能获取查询操作的SQL,新增、修改、删除操作的SQL用该方法无法获取。
总结:
1.正式需要记录SQL给审核人员或者排查故障,用标准日志。
2.写测试性代码,用简单日志。
3.开发阶段,从繁杂的查询操作中立即看到SQL,用ToQueryString方法。