Два идентичных запроса, возвращающие два разных значения. C#. Net Core EF Core - PullRequest
1 голос
/ 15 февраля 2020

Сценарий

Это для диска-бота, использующего библиотеку DSharp. Теперь в этом случае, когда я сообщаю команду на Discord как !status testmenu, содержимое контекста будет !status testmenu. Поэтому, чтобы изолировать command и prefix от тела сообщения, я создаю новую строку message, которая содержит только тело сообщения (testmenu), как показано в этой строке.

 string message = context.Message.Content.Replace(context.Message.Content.Substring(0, (context.Command.Name.Length + 1)), string.Empty);

Однако одновременно параметр content также возвращает только одно тело сообщения. Так что прямо перед условием if оба значения content и message равны, включая чувствительность к регистру.

Так что оба значения message и content имеют строковое значение testmenu .

Причина дубликатов : контролируемое тестирование.

Проблема

Когда я запрашиваю базу данных с первой строкой, message Я получаю нулевое возвращение. Однако, когда я запрашиваю базу данных со второй строкой content (из параметра), я получаю соответствующую запись. Однако имейте в виду, опять же, что и message, и content - идентичные строки, включая чувствительность к регистру.

Я пытался поменять операторы запроса между собой, просто чтобы убедиться, что это не было последовательной ошибкой и не было. Это один и тот же результат каждый раз. Запрос со строкой параметра всегда возвращает значение, в то время как запрос со строкой message возвращает ноль. И да, я действительно поставил точку останова прямо перед оператором if, чтобы убедиться, что строка message не равна нулю и не была. Он имел то же значение, что и контекст.

    [Command("status")]
    public async Task Status(CommandContext context, string content)
    {
        string message = context.Message.Content.Replace(context.Message.Content.Substring(0, (context.Command.Name.Length + 1)), string.Empty);
        Models.Menu SelectedMenu;

        if (!String.IsNullOrEmpty(message))
        {           
           //returns null
            SelectedMenu = await _context.Menus.FirstOrDefaultAsync(m => m.Menu_Name.ToLower().Contains(message)).ConfigureAwait(false);

        }

        //returns appropriate record
        var menu = await _context.Menus.FirstOrDefaultAsync(m => m.Menu_Name.ToLower().Contains(context.Message.Content)).ConfigureAwait(false);
        await context.Channel.SendMessageAsync(menu.Status.ToString()).ConfigureAwait(false);
    }

1 Ответ

0 голосов
/ 15 февраля 2020

Это была глупая ошибка, однако, на первый взгляд, не такая заметная.

string message = context.Message.Content.Replace(context.Message.Content.Substring(0, (context.Command.Name.Length + 1)), string.Empty);

context.Message.Content, из которых «Содержимое» имеет значение "!status testmenu"

context.Command.Name имеет значение "status", и я добавляю +1 к подстроке, чтобы удалить начальное "!" также. Так что теперь строка имеет значение " testmenu"

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

Человеческому глазу в визуальной студии, когда вы наводите курсор мыши во время отладки, над переменными они могут показаться идентичными, но это не тот случай , так как в начале действительно был пробел следовательно, почему я получаю нулевое значение, когда пытаюсь запросить данные.

Как только я обрезал строку и запустил запрос, все заработало как надо.

...