当使用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条记录,因为它考虑了空格。但是,在比较之前调用列表可能会导致将大量集合加载到内存中,而这些内存最终不会被使用。
答案 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查询。