Linq到实体比较字符串忽略空白

本文关键字:空白 字符串 比较 实体 Linq | 更新日期: 2023-09-27 18:02:51

使用LINQ对实体进行字符串比较时将忽略空白。

在我的表中,我有一个nchar(10)列,所以如果保存的数据不是10个字符,则将用空格填充其余的数据。下面我比较"ncharTextColumn"与"Four"字符串。即使ncharText将等于"Four ",它的结果是匹配和"result"变量将包含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条记录,因为它考虑了空白。但是,在比较之前调用to list可能会导致将一个大集合加载到内存中,而这些集合最终不会被使用。

Linq到实体比较字符串忽略空白

这个答案解释了为什么。

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

此规则的唯一例外是LIKE谓词。当正确的时候LIKE谓词表达式的一侧具有带尾符的值空格时,SQL Server不会将两个值填充到相同的长度在比较发生之前。因为LIKE的目的根据定义,谓词是为了方便模式搜索与简单的字符串相等性测试相比,这不会违反本节

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