LinqWhere子句在对空字符串执行String.Contains(String)时没有返回我所期望的内容



昨天我为此挠头一个小时,除了流汗,没有任何结果。

string SearchTag = "";
Extension.getDBService<MyClass>().FindAll(i => <true condition>);

正如我所期望的那样,这返回了我所有的MyClass DB记录。

string SearchTag = "";
Extension.getDBService<MyClass>().FindAll(i => <true condition> && i.TAG.ToLower().Trim().Contains(SearchTag.ToLower().Trim()));

这返回了一个0计数集合!!我不明白。

string SearchTag = "e";
Extension.getDBService<MyClass>().FindAll(i => <true condition> && i.TAG.ToLower().Trim().Contains(SearchTag.ToLower().Trim()));

这将再次返回一个包含所有MyClass DB记录的集合。这是正常的,因为i.TAG总是包含"e"。

为什么我要获得第二个表达式为0的成员集合?"string".Contains(")应该始终为true,对吗?

顺便说一句,扩展.getDBService()是对DBContext的调用。

谢谢你的帮助。

有趣的是,编写LINQ查询的方式会生成SQL CHARINDEX(...) > 0条件,该条件对空字符串返回false。

但是,如果删除(移出查询)SearchTag变量的ToLower().Trim()部分

SearchTag = SearchTag.ToLower().Trim();

并使用

i.TAG.ToLower().Trim().Contains(SearchTag)

在LINQ查询中,则生成的SQL条件是LIKE运算符,并按预期工作。

只是LINQ to Entity与LINQ to Objects不同的另一个例子。

相关内容

最新更新