带有空格的实体框架行为



我有一个场景,我需要允许空的重复项并拒绝其他类型的重复项,因此在使用以下查询插入新记录之前,我要检查现有记录。

this.dbContext.Employees.FirstOrDefault(t =>!string.IsNullOrEmpty(t.Name) && !string.IsNullOrEmpty(newRecord.Name) && t.Name.Trim().Equals(newRecord.Name.Trim(), StringComparison.InvariantCultureIgnoreCase));

问题是,当我有以下数据时:

oldRecord.Name="   "
newRecord.Name="   "

上述查询返回Null。这很奇怪,因为

!string.IsNullOrEmpty(" ")
  1. 结果为真
  2. " ".Trim().Equals(" ".Trim(), StringComparison.InvariantCultureIgnoreCase)的结果为真

所以上面的查询应该会给我结果。

知道我为什么会有这种行为吗?上述查询是否会在客户端进行评估?

为此,还有一个名为IsNullOrWhiteSpace的方法,它具有"更宽的";应用程序并按您的期望工作:

var whiteSpaceStrings = new string[]
{
"   ", // some spaces
"           ", // some tabs
string.Empty, // empty
"", // empty
};
foreach (var str in whiteSpaceStrings)
{
Console.WriteLine(string.IsNullOrWhiteSpace(str));
}

它打印所有true:(

回答您的疑问:IsNullOrEmpty检查字符串是null还是空的,但空字符串是没有任何字符的字符串。空白(任意(是字符本身:(

最新更新