检索由Entity Framework Core生成的SQL

时间:2016-03-22 15:53:16

标签: c# sql entity-framework linq

我正在尝试检索实体框架为以下LINQ查询生成的原始SQL:

pagedItemResults = from firstItem in dbData.Accession
                        join secondItem in pagedRowNumberResults
                        on firstItem.AccessionNumber equals secondItem
                        select new PaginationResultRow
                        {
                            Number = firstItem.AccessionNumber,
                            ID = firstItem.AccessionId,
                            Name = firstItem.AcquisitionType.Name,
                            Description = firstItem.Description
                        };

虽然它可能非常简单并且类似于之前版本的EF已经存在的其他答案,但我没有运气,也没有在网上发现任何想法?

3 个答案:

答案 0 :(得分:3)

您可以通过实施ILoggerProvider打开日志记录。请参阅文档中的details

  

您只需要使用单个上下文实例注册记录器。注册后,它将用于同一AppDomain中上下文的所有其他实例。

        using (var db = new BloggingContext())
        {
            var serviceProvider = db.GetInfrastructure<IServiceProvider>();
            var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
            loggerFactory.AddProvider(new MyLoggerProvider());
        }

您还可以定义要记录的类别。

    private static string[] _categories =
    {
        typeof(Microsoft.Data.Entity.Storage.Internal.RelationalCommandBuilderFactory).FullName,
        typeof(Microsoft.Data.Entity.Storage.Internal.SqlServerConnection).FullName
    };

答案 1 :(得分:1)

您可以通过以下方式将生成的tsql记录到输出窗口中:

  

Microsoft.Extensions.Logging.Debug

首先,从Nuget获取它,然后在您的上下文中,必须定义一个LoggerFactory

然后,在您的上下文中的OnConfiguring中使用它。

public static readonly Microsoft.Extensions.Logging.LoggerFactory _loggerFactory =
                    new LoggerFactory(new[] {
                    new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider()
    });

optionsBuilder.UseLoggerFactory(_loggerFactory);

答案 2 :(得分:0)

我非常喜欢MiniProfiler,请参阅http://miniprofiler.com/。如果没有这样的话,我会说你必须在实际数据库上使用分析器。