Linq Contains不适用于List

时间:2014-04-25 07:36:37

标签: linq list contains


代码


Ç

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中,它已成为区分大小的我可能知道为什么以及如何克服这一点。

3 个答案:

答案 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.IndexOfStringComparison.OrdinalIgnoreCase一起使用:

from x in Items.ToList() 
where(x.Code.IndexOf("a", StringComparison.OrdinalIgnoreCase) >= 0) 
select x