两个选择计数查询之间的Linq差

本文关键字:之间 查询 Linq 两个 选择 | 更新日期: 2023-09-27 18:12:38

我想了解linq查询。我有一个列表_taskDetail,其中包含8个元素。我不明白为什么下面的第一个查询返回答案8?是的,这个列表包含8个元素,但是所有的都是。名称不同,我指定了td。Name == taskName那么为什么它返回所有东西,甚至是td。Name不等于taskName?

第二个查询给出了预期的正确答案1。

  var Ans1 = _taskDetail.Select(td => td.Name == taskName).Count();
  var Ans2 = (from tdList in _taskDetail
                   where tdList.Name == taskName
                   select tdList).Count();

  Ans1 = 8
  Ans2 = 1

两个选择计数查询之间的Linq差

第一个版本没有意义,你需要一个Where,而不是一个Select,这是一个投影,而不是一个过滤器。

在第一个版本中,Select将返回一个IEnumerable<bool>(对于列表中的每个项目,如果Name == taskName则返回true,如果不是返回false)。所以所有的东西都会被退回,点数会给你…列表的计数。

_taskDetail.Where(td => td.Name == taskName).Count();

顺便说一下,您可以简单地执行

_taskDetail.Count(td => td.Name == taskName);

细节可能理解得更好

对应于实际的(错误的)第一个版本(方法语法)的第二个(错误的)版本(查询语法)将是

(from tdList in _taskDetail
 select tdList.Name == taskName).Count();

这是因为第一个查询是错误的。Select只产生一个投影,它不过滤结果。正确的执行方法是使用Where而不是Select

var Ans1 = _taskDetail.Where(td => td.Name == taskName).Count();