2014-05-12 33 views
7

当使用linq来实体进行字符串比较时,会忽略空格。Linq to Entity比较字符串忽略空格

在我的表格中,我有一个nchar(10)列,所以如果不是10个字符,任何数据都会被其余空格填充。下面我将“ncharTextColumn”与"Four"字符串进行比较。甚至想到了ncharText将等于"Four "这导致了比赛和“结果”变量将包含1个记录

 TestEntities1 entity = new TestEntities1(); 

     var result = entity.Table_1.Where(e => e.ncharText == "Four"); 

对此有一个解释,一个方法来解决它还是我将不得不在任何像这样的comaprisons之前,在我的查询中调用ToList。

var newList = result.ToList().Where(e => e.ncharText == "Four"); 

此代码现在可以正确返回0个记录,因为它考虑了空格。然而,在比较之前调用列表可能会导致将大型集合加载到内存中,这不会最终被使用。

+1

你不能只是做'e.ncharText.Trim()== “四”'? –

回答

9

This答案解释了原因。

的SQL Server遵循ANSI/ISO SQL-92规范(第8.2节, 一般规则#3)如何串用空格进行比较。 ANSI 标准要求填充 比较中使用的字符串,以便在比较它们之前匹配它们的长度。填充直接影响谓词和其他Transact-SQL字符串比较的WHERE和HAVING子句的语义。例如,对于大多数比较操作,Transact-SQL认为字符串'abc'和'abc'相当于 。

此规则的唯一例外是LIKE谓词。当LIKE谓词表达式的右侧 侧设有一个尾随 空间中的值,SQL Server不垫的两个值,以相同的长度 发生比较之前。因为LIKE 谓词的目的,顾名思义,是为了方便模式搜索,而不是 简单的字符串相等测试,这并不违反前面提到的ANSI SQL-92规范的部分 。

内部LINQ是对你的数据库只是使SQL查询。