Entity Framework EDMX в C # скрывает значения параметров с помощью @ p__linq__0 - PullRequest
0 голосов
/ 02 октября 2018

Я унаследовал несколько проектов, в которых, очевидно, приложение VS использует старый EDMX.Я не припоминаю, чтобы у нас были такие трудные времена с запросами в прошлом, особенно с выяснением параметров ..

Когда я шагаю по коду, я вижу различные операторы IQueryable<T>, такие как

IQueryable<BreakDomainModel> breakDomainModels = breakFactoryService.ReadBreakData();

Кажется, что все настолько скрыты, что устранение неполадок становится трудным.

Пример части SQL

CASE WHEN ([Extent2].[BreakId] IS NOT NULL) THEN [Extent3].[Name] ELSE @p__linq__0 END AS [C6], 
CASE WHEN ([Extent2].[BreakId] IS NOT NULL) THEN  CAST( [Extent2].[DateCreated] AS datetime2) END AS [C7], 
[Extent1].[ExceptionType] AS [ExceptionType], 
[Extent1].[LinkId] AS [LinkId], 
CASE WHEN ([Extent2].[BreakId] IS NOT NULL) THEN [Extent2].[Age] ELSE @p__linq__1 END AS [C8]

Как мне пройти по коду ифактически получают значения @p__linq__0 и т.д ..?

Я могу предоставить больше кода, если это необходимо, но просто F11 и использование часов просто не помогают.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете зарегистрировать свой собственный DbCommandInterceptor .Взгляните на эту статью о регистрации EF.Обратите внимание, что для регистрации параметров вам придется перебирать DbCommand.Parameters.Минимальное решение для регистрации запросов Select будет:

public class LoggingCommandInterceptor : DbCommandInterceptor
{
    public override void ReaderExecuting(DbCommand command,
        DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        var parameters = command.Parameters.Cast<DbParameter>()
            .Select(x => $"{x.ParameterName}:{x.Value}");
        // It's up to you how you initialize the logger
        GetLogger().Debug($"Parameters: {string.Join(", ", parameters)}\r\n Query: {command.CommandText}");

        base.ReaderExecuting(command, interceptionContext);
    }
}

И тогда все, что вам нужно сделать, это зарегистрировать этот перехватчик в коде запуска вашего приложения (global.asax / Startup.cs / etc):

DbInterception.Add(new LoggingCommandInterceptor());

Если при отладке вам нужно только получить параметры, просто поставьте точку останова внутри метода, она будет срабатывать каждый раз, когда EF обращается к базе данных.

Обратите внимание, что у вас будетпереопределить другие методы (NonQueryExecuting() и ScalarExecuting()) таким же образом, чтобы перехватывать также запросы на обновление / вставку / удаление.

0 голосов
/ 02 октября 2018

Вероятно, будет проще запустить сеанс профилирования SQL, чтобы увидеть сгенерированный запрос.

См. Этот ответ для лучшего решения: Просмотр сгенерированного Sql

...