无法访问 EF Core 中生成的 SQL

时间:2021-07-29 17:29:00

标签: azure entity-framework-core ef-core-3.1

我有一个非常烦人的问题,我无法访问 EF Core 生成的 SQL

我已经尝试过 Azure Data Studio,它分析了正在运行的一些命令,但不是来自我的应用程序的命令

大量网站告诉用户 query.ToQueryString() 但这并不存在

我的变量是 IQueryable 类型

请问我该怎么做?

我使用的是 EF Core 3.1

干杯

保罗

1 个答案:

答案 0 :(得分:0)

ToQueryString() 已添加到 EF Core 5.0。

在 3.1 中,您可以打开 EF Core logging 并查看执行的 SQL 命令。

或者您可以使用以下自定义扩展方法(并在切换到 EF Core 5.0 或更高版本时将其删除):

using System.Collections;
using System.Linq;
using System.Reflection;

namespace Microsoft.EntityFrameworkCore
{
    using Query;
    using Query.Internal;

    public static partial class EfCoreExtensions
    {
        public static string ToQueryString<TEntity>(this IQueryable<TEntity> query)
        {
            var enumerable = query.Provider.Execute<IEnumerable>(query.Expression);
            var enumerableType = enumerable.GetType();
            var relationalQueryContextField = enumerableType.GetField("_relationalQueryContext", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            var relationalQueryContext = (RelationalQueryContext)relationalQueryContextField.GetValue(enumerable);
            var relationalCommandCacheField = enumerableType.GetField("_relationalCommandCache", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            var relationalCommandCache = (RelationalCommandCache)relationalCommandCacheField.GetValue(enumerable);
            var relationalCommand = relationalCommandCache.GetRelationalCommand(relationalQueryContext.ParameterValues);
            return relationalCommand.CommandText;
        }
    }
}