一.利用反射生成查询语句

该方法转载自:https://jhrs.com/2019/28488.html (略有修改)

using Microsoft.EntityFrameworkCore.Query;
using Microsoft.EntityFrameworkCore.Query.Internal;
using Microsoft.EntityFrameworkCore.Storage;
using System.Linq;
using System.Reflection; namespace Common.Standard.EFCore
{
public static class QueryableExtensions
{
private static readonly TypeInfo QueryCompilerTypeInfo = typeof(QueryCompiler).GetTypeInfo(); private static readonly FieldInfo QueryCompilerField = typeof(EntityQueryProvider).GetTypeInfo().DeclaredFields.First(x => x.Name == "_queryCompiler");
private static readonly FieldInfo QueryModelGeneratorField = typeof(QueryCompiler).GetTypeInfo().DeclaredFields.First(x => x.Name == "_queryModelGenerator");
private static readonly FieldInfo DataBaseField = QueryCompilerTypeInfo.DeclaredFields.Single(x => x.Name == "_database");
private static readonly PropertyInfo DatabaseDependenciesField = typeof(Database).GetTypeInfo().DeclaredProperties.Single(x => x.Name == "Dependencies"); /// <summary>
/// 获取本次查询SQL语句
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="query"></param>
/// <returns></returns>
public static string ToSql<TEntity>(this IQueryable<TEntity> query)
{
var queryCompiler = (QueryCompiler)QueryCompilerField.GetValue(query.Provider);
var queryModelGenerator = (QueryModelGenerator)QueryModelGeneratorField.GetValue(queryCompiler);
var queryModel = queryModelGenerator.ParseQuery(query.Expression);
var database = DataBaseField.GetValue(queryCompiler);
var databaseDependencies = (DatabaseDependencies)DatabaseDependenciesField.GetValue(database);
var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);
var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();
modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
var sql = modelVisitor.Queries.First().ToString(); return sql;
}
}
}

使用方法

var ss = _context.UserTable.Where(m => m.UserName == "admin");
string sql = ss.ToSql();

效果

备注:该扩展貌似只能应用于EF查询方法,我尝试过各种重写方法,仍然不能完美的生成真实执行的Sql语句,如果哪位高人有办法做到请在评论区指导一下。

二、Microsoft.Extensions.Logging.Debug在控制台输出完整调试日志

这种方法是比较推荐的,可以完整的输出EF生成的SQL语句

1.用NuGet管理器添加包: Microsoft.Extensions.Logging.Debug

2.修改DbContext类

public partial class MyDbnContext : DbContext
{
[Obsolete]
public static readonly LoggerFactory LoggerFactory = new LoggerFactory(new[] { new DebugLoggerProvider((_, __) => true) }); ... ... protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseLoggerFactory(LoggerFactory);
} ... ...
}

3.在想要查看sql的db.SaveChanges()方法上加断点,然后调试程序。

4.点击VisualStudio工具条:调试->窗口->输出,打开输出日志,并搜索EntityFrameworkCore,结果如下

红框内圈出的就是完整的SQL输出

参考项目:https://github.com/FB208/CodeSpace/blob/master/CodeSpace.CSharp/WebMvc.Model/WebMvc.Model/BBSAdmin/BBSAdminContext.cs

最新文章

  1. tomcat解决加载JSP文件过大错误
  2. js中的eval方法转换对象时,为何一定要加上括号?
  3. css 超出隐藏显示...
  4. word在线问题
  5. 计蒜客 数字解码 dp
  6. 以 Angular 的姿势打开 Font-Awesome
  7. AIX 命令
  8. (一〇四)使用Xcode6创建framework动态静态库
  9. Computer Graphics Principles And Practice (James Foley / Andries Van Dam / Morgan McGuire / David Sklar / James D. Foley 著)
  10. Codeforces831C Jury Marks
  11. 在Ubuntu 16.04下安装nodejs
  12. jQuery之jQuery扩展和事件
  13. Linux安装NET CORE
  14. 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
  15. 搬家通知博文地址(将博客搬到CSDN)
  16. vue脚手架 构建豆瓣App 第一天
  17. EF5+MVC4系列(11)在主视图中用Html.RenderPartial调用分部视图(ViewDate传值);在主视图中按钮用ajax调用子action并在子action中使用return PartialView返回分布视图(return view ,return PartialView区别)
  18. 定义c/c++全局变量/常量几种方法的区别(转载)
  19. 评论alpha发布
  20. SDN前瞻 软件定义网络的一些概念

热门文章

  1. linux常用命令总结篇
  2. 获取IP的三种方法
  3. TKinter容器frame使用
  4. Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】
  5. java之可变个数的形参
  6. 【ST开发板评测】Nucleo-F411RE开箱报告
  7. SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控
  8. TortoiseSVN 无法查看日志 日期显示1970-01-01的解决方案
  9. console的各种输出格式
  10. 读写锁(ReadWriteLock)