EFCore-7 查看EFCore转换后的SQL语句

使用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方法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EF Core中,可以使用LINQ查询语法或原生SQL语句执行数据库操作。下面分别介绍如何使用这两种方式。 1. LINQ查询语法: 使用LINQ查询语法可以通过编写类似于SQL查询的代码来执行数据库操作。以下是一些示例: ```csharp using (var context = new MyDbContext()) { // 查询所有的实体 var entities = context.MyEntities.ToList(); // 查询符合条件的实体 var filteredEntities = context.MyEntities.Where(e => e.Name == "John").ToList(); // 连接查询 var joinedEntities = from e in context.MyEntities join d in context.OtherEntities on e.Id equals d.EntityId select new { Entity = e, OtherEntity = d }; // 排序和分页 var sortedEntities = context.MyEntities.OrderBy(e => e.Name).Skip(10).Take(5).ToList(); } ``` 2. 原生SQL语句: 如果需要执行复杂的数据库操作或使用特定的SQL语句,可以使用EF Core的原生SQL功能。以下是一些示例: ```csharp using (var context = new MyDbContext()) { // 执行原生SQL查询 var entities = context.MyEntities.FromSqlRaw("SELECT * FROM MyTable").ToList(); // 执行原生SQL命令 context.Database.ExecuteSqlRaw("UPDATE MyTable SET Name = 'NewName' WHERE Id = 1"); } ``` 注意:在使用原生SQL时,需要小心防止SQL注入攻击,并确保正确地处理参数化查询。 这些示例演示了如何使用LINQ查询语法和原生SQL语句执行数据库操作。根据具体的需求,您可以选择适合的方式进行操作。如果您需要更多关于EF Core SQL语句的细节或示例,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值