我正在使用Linq处理groupby
查询,但我想将新属性的值与另一个列表一起设置。这是我的代码:
var result = list1.GroupBy(f => f.Name)
.ToList()
.Select(b => new Obj
{
ClientName = b.Name,
Status = (AnotherClass.List().Where(a=>a.state_id=b.????).First()).Status
})
我知道我正在使用group by
,但我不确定如何访问b
集合中的值以将其与a.state_id
进行比较。
这个片段:
Status = (AnotherClass.List().Where(a=>a.state_id=b.????).First()).Status
我之前已经做过但几个月以前我不记得语法,当我在b
后面放一个点时,我只能访问Key
和Linq方法。 ..语法应该是什么?`
答案 0 :(得分:1)
代码中的问题发生在这里:
a=>a.state_id=b.????
为什么?
在此处检查b
的类型,它是IGrouping<TKey,TValue>
,这是因为,在GroupBy
上发布IEnumerable
,结果为IEnumerable<IGrouping<TKey,TValue>>
< / p>
这是什么意思?
考虑数据库中的分组操作,当您在给定GroupBy
上Key
时,选择的剩余列需要聚合操作,因为每个键可能有多个记录,需要代表
如何在代码中表示
list1
有Type T
个对象Name property
分组了数据,Type T
是<{1}} IEnumerable<T>
,作为分组值IEnumerable<IGrouping<TK, TV>>
格式,其中TK
为姓名,电视代表IEnumerable<T>
让我们查看一些代码,在以下部分中删除原始代码
var result = list1.GroupBy(f => f.Name)
- result
的类型为IEnumerable<IGrouping<string,T>>
,其中list1
为IEnumerable<T>
result.Select(b => ...)
时,b
的类型为IGrouping<string,T>
b
上运行Linq查询,如下所示:
b.Key
,可以访问Name
密钥,但没有b.Value
,因为您的选项可能会跟随或任何其他相关的Linq操作: a=>b.Any(x => a.state_id == x.state_id)
或//如果ID在集合中匹配,则进行提取
a=>a.state_id == b.FirstOrDefault(x => x.state_id)
//选择第一个或默认值
因此,您可以根据逻辑要求/用例<{1}}从IGrouping<string,T>
创建最终结果