C# 实体框架查询中string.Trim()的行为
我正在尝试将名称列表复制到SQL Server表中,为此我设置了一个Entity Framework项目 名称列表中有重复的值,一些名称的末尾有空格。我只希望插入表中尚未包含的名称,并从其末尾修剪空格。看起来很简单,对吧 我的解决办法是:C# 实体框架查询中string.Trim()的行为,c#,sql-server,string,entity-framework,trim,C#,Sql Server,String,Entity Framework,Trim,我正在尝试将名称列表复制到SQL Server表中,为此我设置了一个Entity Framework项目 名称列表中有重复的值,一些名称的末尾有空格。我只希望插入表中尚未包含的名称,并从其末尾修剪空格。看起来很简单,对吧 我的解决办法是: if (!context.Names.Any(n => n.Value == nameToCopy.Trim()) context.Names.Add(nameToCopy.Trim()) 注意。这不是我的确切代码,只是一个示例,所以不必提及我正在
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)
有人能解释为什么第一个解决方案在数据库查询中不使用字符串的修剪版本吗
谢谢总体结果应该是一样的。你是如何分析的
!context.Names.Any(n => n.Value == nameToCopy.Trim())
上面,Linq to Entities.Trim()
转换为TSQLRTRIM(LTRIM())
,字符串变量以原始状态发送到SQL server,并作为查询的一部分进行修剪
string trimmedName = nameToCopy.Trim()
if (!context.Names.Any(n => n.Value == trimmedName)
而上面的
.Trim()
是一个正常的系统.String.Trim()
和字符串var在发送到SQL Server之前被修剪。我不确定您的真实代码是什么,但这两个代码似乎是相同的。L2E的一点是,您应该注意,在某些数据库配置中,是否修剪数据或使用大写字母并不重要…例如name=“Adam”
或name=“ADAM”
可能具有相同的输出。