EntityFrameworkCore中linq转sql

来源:互联网 发布:网络质量监控技术 编辑:程序博客网 时间:2024/06/10 13:34
public class IQueryableExtensions  {    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 PropertyInfo NodeTypeProviderField = QueryCompilerTypeInfo.DeclaredProperties.Single(x => x.Name == "NodeTypeProvider");    private static readonly MethodInfo CreateQueryParserMethod = QueryCompilerTypeInfo.DeclaredMethods.First(x => x.Name == "CreateQueryParser");    private static readonly FieldInfo DataBaseField = QueryCompilerTypeInfo.DeclaredFields.Single(x => x.Name == "_database");    private static readonly FieldInfo QueryCompilationContextFactoryField = typeof(Database).GetTypeInfo().DeclaredFields.Single(x => x.Name == "_queryCompilationContextFactory");    public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class    {        if (!(query is EntityQueryable<TEntity>) && !(query is InternalDbSet<TEntity>))        {            throw new ArgumentException("Invalid query");        }        var queryCompiler = (IQueryCompiler)QueryCompilerField.GetValue(query.Provider);        var nodeTypeProvider = (INodeTypeProvider)NodeTypeProviderField.GetValue(queryCompiler);        var parser = (IQueryParser)CreateQueryParserMethod.Invoke(queryCompiler, new object[] { nodeTypeProvider });        var queryModel = parser.GetParsedQuery(query.Expression);        var database = DataBaseField.GetValue(queryCompiler);        var queryCompilationContextFactory = (IQueryCompilationContextFactory)QueryCompilationContextFactoryField.GetValue(database);        var queryCompilationContext = queryCompilationContextFactory.Create(false);        var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();        modelVisitor.CreateQueryExecutor<TEntity>(queryModel);        var sql = modelVisitor.Queries.First().ToString();        return sql;    }}
转自:https://twitter.com/rjperes75
0 0
原创粉丝点击