场景
这是使用DSharp库的不和谐的bot。现在在这种情况下,当我在不和谐的情况下以!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
字符串的查询返回null。是的,我的确确实在“ if”语句之前放置了一个断点,只是为了确保message
字符串不为null,也不为空。它具有与上下文相同的值。
[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);
}
答案 0 :(得分:0)
这乍看之下是一个愚蠢的错误,并不那么明显。
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"
正如您在此处看到的那样,我没有修剪此字符串,因此开头仍留有空白。
对于Visual Studio中的人来说,当您在调试时将鼠标悬停在变量上时,它们似乎相同,但事实并非如此,因为开始时确实存在空白,因此为什么在我尝试查询数据时收到空值。
一旦我修剪了字符串并运行了查询,一切都会正常进行。