本文阅读导航
展开
最新标题:EF Core获取上下文SQL语句,扩展1个方法直接用,原标题:EF Core怎样取得上下文执行查询所生成的SQL语句。

EF Core获取上下文SQL语句
瞄了一下微信群,里面有朋友应该是遇到了ef core的使用问题,估计跟我2年前刚开始使用ef core一样遇到了想要通过C#代码跟踪查询究竟ef core生成的SQL语句长啥样,并记录到日志里面。
ef core与老版本的ef 有很大的区别,在通过C#获取其生成的sql方式不同,现直接放送ef core是怎样获取到其查询生成的sql语句,我们需要编写一个扩展方法,需要使用时,直接调用即可,代码如下:
需要使用的命名空间
using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.Query.Internal; using Microsoft.EntityFrameworkCore.Storage; using System.Linq; using System.Reflection;
通过扩展类实现
/// <summary>
///
/// </summary>
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;
}
}
如何使用?
// 下面的query对象是个IQueryable对象 //var query = testServices.Query(predicate); // _logger.LogError(query.ToSql());
以上就是通过C#代码获取ef core其生成的sql语句的方式。

【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2019/28488.html
扫码加入电报群,让你获得国外网赚一手信息。