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

Dan*_*iel 3 c# linq ienumerable

当我将var更改为IEnumerable时,我的搜索结果区分大小写; 考虑下面的代码:

以下代码返回RA或ra的两种情况:

var result = from x in dataBase.tableName 
             select x;
result = result.Where(x => x.id.Contains("ra"));
Run Code Online (Sandbox Code Playgroud)

下面的代码只返回ra而不是RA的情况:

IEnumerable result = from x in dataBase.tableName 
                     select x;
result = result.Where(x => x.id.Contains("ra"));
Run Code Online (Sandbox Code Playgroud)

有人可以帮助并解释我发生了什么吗?结果不应该相似吗?

Jon*_*eet 9

区别在于,在第一种情况下,var将是IQueryable<T>- 这意味着您的Where调用将是Queryable.Where(将您的lambda表达式转换为表达式树之后).过滤器最终在数据库中执行,我怀疑你的字段不区分大小写(因此搜索不区分大小写).

在第二种情况下,你有一个IEnumerable<T>,所以你的Where调用将是Enumerable.Where(在将你的lambda表达式转换为委托之后).过滤器最终在.NET代码中执行 - 其中Contains始终区分大小写.

基本上,LINQ是一个漏洞抽象 - 是的,如果相同的过滤器在所有情况下都给出了相同的结果,那将是可爱的,但这是不现实的.了解泄漏的位置,并采取相应措施 - LINQ仍然是一个巨大的福音:)


Bro*_*ass 7

你的result变量不是IEnumerable- 它是一个IQueryable.

手动更改类型时,结果会发生变化,IEnumerable因为您现在Contains使用Linq to Objects 执行以下查询,而不是使用Linq to Entities(或Linq to SQL)执行数据库.

IEnumerable您的查询是使用lambda表达式,使每个结果从DB到存储器并执行所述区分大小写Contains()扩展方法.

随着IQueryable您的查询使用表达式目录树,并会尝试创建与相应数据库查询Contains查询这恰好是不区分大小写(最有可能是SQL LIKE查询).

只是将隐式类型显式化IQueryable将解决您的问题.