项
代码
甲
乙
Ç
from x in Items where(x.Code.Contains("a")) select x //This Linq returns A
from x in Items.ToList() where(x.Code.Contains("a")) select x //This Linq returns nothing
在第二个Linq中,它已成为区分大小的我可能知道为什么以及如何克服这一点。
答案 0 :(得分:2)
SQL Server使用默认排序规则不区分大小写,因此在对数据库执行SQL查询时,这两种情况都将起作用。当您致电ToList()
时,所有项目都会从数据库中提取并放入区分大小写的List<T>
,然后过滤这些项目。由于List<T>
区分大小写,因此对于小写值,它将返回false。
你应该使用你拥有的第一个代码,否则在大表的情况下会出现性能问题,因为你基本上会使用第二个代码进行SELECT * FROM
。
答案 1 :(得分:2)
这可能是因为您的第一个查询是Linq-To-SQL
,因此不区分大小写,而您的第二个查询是Linq-To-Objects
,因此纯对象包含所有附带的查询。
然后只需执行以下操作:
from x in Items.ToList() where(x.Code.ToLower().Contains("a")) select x
它应该做的工作。
答案 2 :(得分:1)
我认为这是LINQ-To-SQL或其他一些将其转换为SQL的LINQ提供程序。数据库是不明智的by default,但C#不是。当您致电ToList
时,您将创建一个内存列表。由于x.Code
似乎是String
,因此您使用String.Contains
来查找区分大小写的子字符串。
如果您愿意,可以将String.IndexOf
与StringComparison.OrdinalIgnoreCase
一起使用:
from x in Items.ToList()
where(x.Code.IndexOf("a", StringComparison.OrdinalIgnoreCase) >= 0)
select x