Linq to Entity比较字符串忽略空格

当使用linq实体进行字符串比较时,将忽略空格。

在我的表中,我有一个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记录,因为它考虑了空格。 但是,在比较之前调用list可能会导致将大型集合加载到内存中,而这些内存最终不会被使用。

这个答案解释了原因。

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

此规则的唯一例外是LIKE谓词。 当LIKE谓词表达式的右侧具有带尾随空格的值时,SQL Server不会在比较发生之前将这两个值填充到相同的长度。 因为根据定义,LIKE谓词的目的是促进模式搜索而不是简单的字符串相等性测试,这不违反前面提到的ANSI SQL-92规范的部分。

LINQ内部只是对您的数据库进行SQL查询。