Vb.net 在带有复杂范围变量的GroupBy中使用查询语法

Vb.net 在带有复杂范围变量的GroupBy中使用查询语法,vb.net,linq,Vb.net,Linq,我有一个LINQ查询,我想对集合中的元素进行分组。我试图使用查询语法来实现我的结果,但我不知道如何使用查询语法来描述更复杂的范围变量 使用方法语法,可以实现以下功能: Dim R = someCollection.GroupBy(Function(x) For Each cItem In x.Attributes If cItem.N

我有一个LINQ查询,我想对集合中的元素进行分组。我试图使用查询语法来实现我的结果,但我不知道如何使用查询语法来描述更复杂的范围变量

使用方法语法,可以实现以下功能:

Dim R = someCollection.GroupBy(Function(x)
                                       For Each cItem In x.Attributes
                                           If cItem.Name = "N1" Then Return cItem.Value
                                       Next
                                   End Function)
我尝试用查询语法执行此操作,但失败了。因此,这不起作用,并给出了一个错误:
范围变量名只能从没有参数的简单或限定名推断出来。

Dim R = From q In someCollection
            Group q By Function(x)
                           For Each cItem In q.Attributes
                               If cItem .Name = "N1" Then Return cItem .Value
                           Next
                       End Function
                Into Group

我尝试了各种其他版本,但都没有用。如何使用查询语法按复杂参数分组?或者应该坚持方法语法?

对于第一次满足条件时退出的每个循环,通常可以将
折叠为对
first
FirstOrDefault
single
SingleOrDefault
的单个调用。在这种情况下,最好的选择取决于是否总是有一个匹配项,或者可以没有匹配项或多个匹配项

总是一个:单身 永远不要超过一个:SingleOrDefault 不少于一个:第一 无、一个或多个:FirstOrDefault

在这种情况下,假设最后一种情况:

Group q By q.Attributes.FirstOrDefault(Function(a) a.Name = "N1")?.Value

之所以使用空传播,是因为“OrDefault”意味着可以不返回任何内容。

可能
按q.Attributes.FirstOrDefault(函数(a)a.Name=“N1”)?.Value对q进行分组。
。顺便说一句,如果不描述错误,就说“出现错误”是绝对不可接受的。哇。似乎我不知道第一个或默认值。是的,这很有效。如果你能写下来作为回答,我会接受的。谢谢你注意到我不完整的描述。编辑了原文。在我的例子中,可能没有匹配项,也可能只有一个匹配项,所以我想,
SingleOrDefault
也同样适用。但是在输入数据损坏的情况下,
FirstOrDefault
似乎更安全。谢谢你的详细解释。我从中学到了很多东西。
SingleOrDefault
在这种情况下是更正确的选择。区别在于,如果存在多个匹配项,它将抛出异常。这听起来可能不受欢迎,但当您的应用程序处于无效状态时,应该这样做。值得注意的是,一些LINQ提供程序并不同时支持这两种功能,例如LINQ to实体只支持
First
FirstOrDefault
。我怀疑这是因为从查询生成的SQL不可能没有多个匹配项。