当使用linq实体进行字符串比较时,将忽略空格.
在我的表中,我有一个nchar(10)列,因此如果不是10个字符,则保存的任何数据将使用空格填充其余数据.下面我将"ncharTextColumn"与"Four"字符串进行比较.甚至认为ncharText将等于 "Four "它导致匹配,"result"变量将包含1条记录
TestEntities1 entity = new TestEntities1();
var result = entity.Table_1.Where(e => e.ncharText == "Four");
Run Code Online (Sandbox Code Playgroud)
有没有解释这个和解决它的方法或我将不得不在任何comaprisons之前调用我的查询ToList.
var newList = result.ToList().Where(e => e.ncharText == "Four");
Run Code Online (Sandbox Code Playgroud)
此代码现在正确地返回0记录,因为它考虑了空格.但是,在比较之前调用list可能会导致将大型集合加载到内存中,而这些内存最终不会被使用.
我正在尝试将名称列表复制到SQL Server表中,我为其设置了Entity Framework项目.
名称列表具有重复值,并且其中几个在其末尾具有空格.我希望只插入表中尚未存在的名称,以及从它们的末尾修剪空格.看起来相当简单吧?
我的解决方案是:
if (!context.Names.Any(n => n.Value == nameToCopy.Trim())
context.Names.Add(nameToCopy.Trim())
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么第一个解决方案不在数据库查询中使用剪裁版本的字符串?
谢谢