entity framework查询中string.Trim()的行为

我正在尝试将名称列表复制到SQL Server表中,为此我有一个Entity Framework项目设置。

名称列表具有重复值,并且几个名称的末尾有空格。 我希望只插入表中尚未包含的名称,以及从它们的末尾修剪空格。 看起来相当简单吧?

我的解决方案是:

if (!context.Names.Any(n => n.Value == nameToCopy.Trim()) context.Names.Add(nameToCopy.Trim()) 

NB。 这不是我的确切代码,只是一个例子,所以不必提及我正在修剪两次!

令我惊讶的是,上述方法并不像我预期的那样有效。 我在发现上述语句时发现, if (!context.Names.Any(n => n.Value == nameToCopy.Trim())实际上并不查询nameToCopy的修剪版本 – 几个查询过的名称他们的结尾有空格。

但是,如果我执行以下操作,则按预期工作:

 string trimmedName = nameToCopy.Trim() if (!context.Names.Any(n => n.Value == trimmedName) context.Names.Add(trimmedName) 

任何人都可以解释为什么第一个解决方案不在数据库查询中使用剪裁版本的字符串?

谢谢

总体结果应该是相同的。 你是如何剖析的?

 !context.Names.Any(n => n.Value == nameToCopy.Trim()) 

上面,Linq to Entities .Trim()转换为TSQL RTRIM(LTRIM()) ,字符串var以其原始状态发送到SQL Server,并作为查询的一部分进行修剪。

 string trimmedName = nameToCopy.Trim() if (!context.Names.Any(n => n.Value == trimmedName) 

上面, .Trim()是一个普通的System.String.Trim()并且在发送到SQL Server之前修剪字符串var。