通过将var更改为IEnumerable来获得不同的搜索结果

时间:2011-08-14 07:03:14

标签: c# linq ienumerable

当我将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"));

有人可以帮忙解释一下发生了什么吗?结果不应该相似吗?

2 个答案:

答案 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即可解决问题。