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

时间:2014-05-12 16:13:39

标签: c# entity-framework linq-to-entities

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

在我的表中,我有一个nchar(10)列,因此如果不是10个字符,则保存的任何数据将使用空格填充其余数据。下面我要比较" ncharTextColumn"使用"Four"字符串。即使ncharText等于"Four "它也会导致匹配并且"结果"变量将包含1条记录

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

是否有对此的解释以及解决此问题的方法,或者在进行任何比较之前我必须在查询上调用ToList。

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

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

1 个答案:

答案 0 :(得分:9)

This回答解释了原因。

  

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

     

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

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