5

我正在尝试将名称列表复制到 SQL Server 表中,为此我设置了实体框架项目。

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

我的解决方案是这样的:

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

注意。这不是我的确切代码,只是一个示例,所以无需提及我正在修剪两次!

令我惊讶的是,上述内容并没有按我预期的方式工作。我在分析上述语句时发现,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)

谁能解释为什么第一个解决方案不在数据库查询中使用修剪后的字符串版本?

谢谢

4

1 回答 1

8

总体结果应该是一样的。你是如何分析的?

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

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

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

而在上面,这.Trim()是一个正常System.String.Trim()的字符串 var 在发送到 SQL Server 之前被修剪。

于 2013-07-02T11:37:55.417 回答