如何在 C# 中编写多行 SQL 字符串,但将其视为单行字符串

  • 本文关键字:字符串 单行 SQL c# sql
  • 更新时间 :
  • 英文 :


应用程序中有一个生成SQL语句的部分。它有一个单元测试,目前仅比较给定的查询字符串是否与预期的查询字符串匹配。我正在使用带有插值的多行字符串(简化示例(

command.Should().Be($@"UPDATE `todo`
SET `todo`.`is_done`=0
WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'");

以这种方式编写多行字符串看起来像这样

"UPDATE `todo`
SET `todo`.`is_done`=0
WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'"

缩进中填充有空字符。代码生成的 SQL 字符串是这样的

"UPDATE `todo` SET `todo`.`is_done`=0 WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'"

单元测试失败,因为生成的字符串与预期的字符串不匹配。如何从预期的字符串中删除空字符?因为当前测试失败

预期字符串为...长度为377,但是...有长度 的 206 ...

您可以使用字符串串联在源代码中实现类似的格式设置,以及所需的字符串值:

command.Should().Be("UPDATE `todo` " +
"SET `todo`.`is_done`=0 " +
"WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'");

可能的解决方案:

  1. 你不能使用 @ 并像这样写它

    command.Should().Be($"UPDATE `todo` SET `todo`.`is_done`=0 WHERE `todo`.`id`='a9cebb04fa7d-4071-9f3e-0704bd3352fa'");

  2. 您可以使用字符串连接,就像在另一个答案中一样

    command.Should().Be("UPDATE `todo` " + "SET `todo`.`is_done`=0 " + "WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'");

  3. 您可以规范化字符串以删除所有空格和,例如使用正则表达式

    Regex.Replace(s1, @"s", "");

但是您需要为两行都这样做

我认为至少有两种选择:

不要使用换行符

只需初始化不带换行符的字符串并使用字符串连接:

expectedCommand = "UPDATE `todo` " +
"SET `todo`.`is_done`=0 " +
"WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'";
command.Should().Be(expectedCommand);

去除空格

如果您确实需要使用空格输入,则可以在比较它们之前从实际字符串和带有正则表达式的预期字符串中删除所有空格:

expectedCommand = $@"UPDATE `todo`
SET `todo`.`is_done`=0
WHERE `todo`.`id`='a9cebb04-fa7d-4071-9f3e-0704bd3352fa'";
actualCommandTrimmed = Regex.Replace(command, @"s+", "");
expectedCommandTrimmed = Regex.Replace(expectedCommand, @"s+", "");
actualCommandTrimmed.Should().Be(expectedCommandTrimmed);

但正如@RobertSynoradzki提到的,你不应该这样做:

正则表达式的性能不是很好。当您对某些内容进行硬编码只是为了在它之后运行密集型操作时(在本例中:正则表达式(,您始终可以对结果进行硬编码。

最新更新