8

I'm wondering what happened to: QueryModelGenerator, RelationalQueryModelVisitor and queryCompilationContext.CreateQuerymodelVisitor() all seems to have vanished.

I have the following code and I'm failing to try to convert it to .NET Core 3 from 2.2

public static string ToSql<TEntity>(this IQueryable<TEntity> query, DbContext dbCtx)
{
    var modelGenerator = dbCtx.GetService<IQueryModelGenerator>();
    var queryModel = modelGenerator.ParseQuery(query.Expression);
    var databaseDependencies = dbCtx.GetService<DatabaseDependencies>();
    var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);
    var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
    modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
    var sql = modelVisitor.Queries.FirstOrDefault()?.ToString();
    return sql;
}
Node.JS
  • 1,042
  • 6
  • 44
  • 114
  • Does this answer your question? [Get SQL code from an Entity Framework Core IQueryable](https://stackoverflow.com/questions/37527783/get-sql-code-from-an-entity-framework-core-iqueryablet) – Zied Dec 11 '19 at 19:14

1 Answers1

14

Isn't supported anymore in EF 3.

Here how to do it now

    public static string ToSql<TEntity>(this IQueryable<TEntity> query)
    {
        var enumerator = query.Provider.Execute<IEnumerable<TEntity>>(query.Expression).GetEnumerator();
        var enumeratorType = enumerator.GetType();
        var selectFieldInfo = enumeratorType.GetField("_selectExpression", BindingFlags.NonPublic | BindingFlags.Instance) ?? throw new InvalidOperationException($"cannot find field _selectExpression on type {enumeratorType.Name}");
        var sqlGeneratorFieldInfo = enumeratorType.GetField("_querySqlGeneratorFactory", BindingFlags.NonPublic | BindingFlags.Instance) ?? throw new InvalidOperationException($"cannot find field _querySqlGeneratorFactory on type {enumeratorType.Name}");
        var selectExpression = selectFieldInfo.GetValue(enumerator) as SelectExpression ?? throw new InvalidOperationException($"could not get SelectExpression");
        var factory = sqlGeneratorFieldInfo.GetValue(enumerator) as IQuerySqlGeneratorFactory ?? throw new InvalidOperationException($"could not get IQuerySqlGeneratorFactory");
        var sqlGenerator = factory.Create();
        var command = sqlGenerator.GetCommand(selectExpression);
        var sql = command.CommandText;
        return sql;
    }

See more here : https://stackoverflow.com/a/51583047/196698 https://gist.github.com/rionmonster/2c59f449e67edf8cd6164e9fe66c545a#gistcomment-3059688

Zied
  • 1,696
  • 12
  • 20