zoukankan      html  css  js  c++  java
  • EF Core怎样取得上下文执行查询所生成的SQL语句

    直接上代码:

    using Microsoft.EntityFrameworkCore.Query;
    using Microsoft.EntityFrameworkCore.Query.Internal;
    using Microsoft.EntityFrameworkCore.Storage;
    using System.Linq;
    using System.Reflection;
    
    
    namespace Common.Extension
    {
        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;
            }
        }
    }

    通过以上代码便可得到EF的执行SQL语句。

    本文转自:https://jhrs.com/2019/28488.html

  • 相关阅读:
    bzoj 4260 Codechef REBXOR——trie树
    bzoj 2238 Mst——树链剖分
    bzoj 2836 魔法树——树链剖分
    CF 888E Maximum Subsequence——折半搜索
    bzoj 4289 PA2012 Tax——构图
    bzoj 4398 福慧双修——二进制分组
    bzoj1116 [POI2008]CLO——并查集找环
    bzoj4241 历史研究——分块
    bzoj4373 算术天才⑨与等差数列——线段树+set
    bzoj4034 [HAOI2015]树上操作——树链剖分
  • 原文地址:https://www.cnblogs.com/bluesky0122/p/11048348.html
Copyright © 2011-2022 走看看