EF Core 实战教程(六)如何查看EF Core生成的Sql语句
小白浏览:8932022-09-17 17:13:41本文累计收益:0我也要赚钱

EF Core 写的增删改查语句最终都会通过ado.net core生成Sql语句发给数据库去执行。这里简单介绍两种查看EF Core生成sql语句的方式,当然也可以直接使用Sql Server数据库提供的Sql Server Profiler工具进行查看,不过仅限于Sql Server数据库。

1、日志方式输出

在DbContext实现类的OnConfiguring方法中增加如下代码可以将sql语句输出到控制台。

           optionsBuilder.LogTo(msg => {
                if (!msg.Contains("CommandExecuting")) return;
                Console.WriteLine(msg);
            });

全部代码如下:

public class MyDbContext:DbContext
    {
        public DbSet<Person> Persons { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFCoreTest;Persist Security Info=True;User ID=sa;Password=*****");
            //输出日志到控制台-方式1
            optionsBuilder.LogTo(msg => {
                if (!msg.Contains("CommandExecuting")) return;
                Console.WriteLine(msg);
            });

        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //从指定程序集里面添加实体配置类
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }

运行var list = db.Persons.ToList();语句控制台输出代码如下:

2、通过ToQueryString()扩展方法查询,查询生成的SQL语句

本方法只能查看EF Core查询语句生成的Sql语句,是IQueryable<T>提供的方法。

代码如下:

MyDbContext db = new MyDbContext();
//var list = db.Persons.ToList();
IQueryable<Person> personList = db.Persons;
string sql = personList.ToQueryString();
Console.WriteLine("ToQueryString输出语句:"+ sql);

小知识:

运行以上代码时,上面讲的日志方式输出并没有关闭,执行IQueryable<Person> personList = db.Persons;这里并没有输出日志,说明这句代码并没有被真正的执行,这是IEnumerable的特性,只有在用到的时候才会被真正执行。比如一旦.ToList()的时候就真被执行了。

以前代码总是这么写var list = db.Persons.ToList();现在想想这样写的代码运行效率太低了,写在这里记录一下以后注意。

微信扫一扫,欢迎进群交流:

评论列表
发表评论
+ 关注