mirror of
https://github.com/ACEmulator/ACE
synced 2026-08-17 12:26:06 -04:00
36 lines
1.9 KiB
C#
36 lines
1.9 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
using Microsoft.EntityFrameworkCore.Query;
|
|
using Microsoft.EntityFrameworkCore.Query.Internal;
|
|
using Microsoft.EntityFrameworkCore.Storage;
|
|
|
|
|
|
namespace ACE.Database.Extensions
|
|
{
|
|
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(Microsoft.EntityFrameworkCore.Storage.Database).GetTypeInfo().DeclaredProperties.Single(x => x.Name == "Dependencies");
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|