当我将var更改为IEnumerable时,我的搜索结果区分大小写;请考虑以下代码:
以下代码返回RA或ra的两种情况:
var result = from x in dataBase.tableName
select x;
result = result.Where(x => x.id.Contains("ra"));
以下代码仅返回ra而不是RA的案例:
IEnumerable result = from x in dataBase.tableName
select x;
result = result.Where(x => x.id.Contains("ra"));
有人可以帮忙解释一下发生了什么吗?结果不应该相似吗?
答案 0 :(得分:9)
不同之处在于,在第一种情况下,var
将是IQueryable<T>
- 这意味着您的Where
调用将发送到Queryable.Where
(将您的lambda表达式转换为表达树)。过滤器最终在数据库中执行,我怀疑你的字段不区分大小写(因此搜索不区分大小写)。
在第二种情况下,您有一个IEnumerable<T>
,因此您的Where
调用将发送到Enumerable.Where
(将您的lambda表达式转换为委托后)。过滤器最终在.NET代码中执行 - 其中Contains
始终区分大小写。
基本上,LINQ是一个漏洞抽象 - 是的,如果相同的过滤器在所有情况下都给出了相同的结果,那将是可爱的,但这是不现实的。了解泄漏的位置,并采取相应的行动 - LINQ仍然是一个巨大的福音:)
答案 1 :(得分:7)
您的result
变量不是IEnumerable
- 它是IQueryable
。
当您手动将类型更改为IEnumerable
时,结果会发生变化,因为您现在使用Linq to Objects执行以下Contains
查询,而不是使用Linq to Entities(或Linq to SQL)执行数据库。
使用IEnumerable
,您的查询将使用您的lambda表达式,将DB中的每个结果带入内存并执行区分大小写的Contains()
扩展方法。
使用IQueryable
,您的查询使用表达式树,并尝试使用Contains
查询创建相应的数据库查询,该查询恰好不区分大小写(很可能是SQL LIKE
查询)。
只需将隐式类型显式为IQueryable
即可解决问题。