两个选择计数查询之间的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
第一个版本没有意义,你需要一个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();