【问题标题】:Behaviour of string.Trim() in an Entity Framework query实体框架查询中 string.Trim() 的行为
【发布时间】:2013-06-29 03:35:45
【问题描述】:

我正在尝试将名称列表复制到 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)

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

谢谢

【问题讨论】:

  • 我不确定您的真实代码是什么,但这两个代码似乎相同。 L2E 的一件事您应该知道,在某些数据库配置中,是否修剪数据或使用大写字母都无关紧要......例如name = "Adam"name = "ADAM " 可以有相同的输出。

标签: c# sql-server string entity-framework trim


【解决方案1】:

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

!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 之前被修剪。

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-03-17
    • 2014-02-24
    相关资源
    最近更新 更多