由Linq分组设置属性

时间:2016-10-07 15:54:12

标签: c# linq

我正在使用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方法。 ..语法应该是什么?`

1 个答案:

答案 0 :(得分:1)

代码中的问题发生在这里:

a=>a.state_id=b.????

为什么?

在此处检查b的类型,它是IGrouping<TKey,TValue>,这是因为,在GroupBy上发布IEnumerable,结果为IEnumerable<IGrouping<TKey,TValue>> < / p>

这是什么意思?

考虑数据库中的分组操作,当您在给定GroupByKey时,选择的剩余列需要聚合操作,因为每个键可能有多个记录,需要代表

如何在代码中表示

  1. 我们假设list1Type T个对象
  2. 您按Name property分组了数据,Type T是<{1}}
  3. 的一部分
  4. 没有数据投影,因此对于给定的密钥,它会将剩余数据汇总为IEnumerable<T>,作为分组值
  5. 结果采用IEnumerable<IGrouping<TK, TV>>格式,其中TK为姓名,电视代表IEnumerable<T>
  6. 让我们查看一些代码,在以下部分中删除原始代码

    • var result = list1.GroupBy(f => f.Name) - result的类型为IEnumerable<IGrouping<string,T>>,其中list1IEnumerable<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>创建最终结果