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

标签 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"));

有人可以帮我解释一下这是怎么回事吗?结果不应该相似吗?

最佳答案

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

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

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

关于c# - 通过将 var 更改为 IEnumerable 来获得不同的搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7055512/

相关文章:

c# - 在特定行读取文本文件

c# - 如何保持打开的 xml 文档的样式

c# - Excel.Range 到 C# 中的字符串转换

c# - 带有三元运算符的 IEnumerable Select 语句

c# - "yield return"概念的名称是什么? IEnumerable、迭代器、生成器?

c# - 将类的对象声明为 null

linq - 无法转换为 system.guid

c# - 有没有办法将 IEnumerable 转换为 XElements 的集合?

c# - 在 C# 中使用 LINQ 比较两个 List<string>

c# - 从序列末尾获取元素的linq扩展方法