我有2个LINQ查询,一个返回我期望的,另一个没有,我试图理解为什么。我试图弄清楚是否从Config中的所有节点,是否有一个名为“TEST”的节点,其Selected属性为True。
查询1 - 返回正确的东西,条件是Any():
var res1 =
(from config in _config.CurrentSettings.Config let name = config.name select config).Any(
config => config.name.Equals("TEST") && config.selected == true);
查询2失败,其条件为Select:
(_config.CurrentSettings.Config.Select(config => config.name.Equals("TEST") && config.selected))
.Any();
答案 0 :(得分:5)
LINQ' Any()
没有条件意味着"至少有一行"。第一个查询指定一个条件,使其至少有一行符合条件"。
要使第二个查询等同于第一个查询,请使用Any(flag => flag)
,或将Select
替换为Where
。这两个选项都不如初始Any
,条件在里面,因为它们不是那么可读。
答案 1 :(得分:1)
这里的一切都没用。
(from config in _config.CurrentSettings.Config let name = config.name select config)
您可以将其缩小到此
_config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected == true);
与第一段代码相同。
Select
方法使用选择器将ienumerable转换为另一个表单
你给。
如果sequence包含任何元素,则无参数Any
返回true。否则返回false。
答案 2 :(得分:1)
您可能想尝试:
var isTestSelected = _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected);
如果查看每个链接的“参数”部分,您会看到虽然两种方法都接受Func
,但它们的用法实际上是不同的。
<强>任何强>
谓词 类型:
System.Func<TSource, Boolean>
一个测试每个的函数 条件的元素。
选择强>
选择 键入:
System.Func<TSource, TResult>
转换函数 适用于每个元素。
因此,在Query1示例中,您将一个转换(或映射)应用于集合中的每个项目,这些项目声明了一个本地名称变量
let name = config.name
(未使用),然后按原样返回对象(不实际转换任何内容)select config
。这段代码是多余的,可以删除。
您的Any()
lambda正在通过过滤与您的lambda谓词不匹配的项目来完成Query1中的所有工作。
在Query2中,您将过滤lambda传递给变换函数,然后使用不带过滤器的过滤函数。
使用Linq有许多不同的方法可以获得所需的结果。我鼓励您查看框架(link)提供的不同映射(选择器)和过滤(谓词)函数。