如何在Linq GroupBy中获取分组值的列表?

23

我是一个Linq新手,正在为我的第一个GroupBy查询苦苦挣扎。

我有一个KeywordInstance对象列表,表示一个关键词和应用该关键词的数据库记录的ID。

Keyword      RecordID
macrophages  1
macrophages  2
cell cycle   3 
map kinase   2
cell cycle   1

我想要的是一个包含所有关键词及其应用到哪些记录ID的列表。

Keyword     RecordIDs 
macrophages 1, 2
cell cycle  1, 3
map kinase  2

我尝试使用 Linq 将其转换为一个新的对象,但我只能得到不同的关键词。

var keywords = allWords .GroupBy(w => w.keyword) .Select(g => new {keyword = g.Key});

问题在于我似乎无法以任何方式获取 g 的值。 g 的类型是 IGrouping<String, KeywordInstance>,根据文档,它只有属性 Key,甚至没有属性 Value。我在互联网上看到的所有关于 groupby 的示例都只告诉我选择 g 本身,但是这段代码的结果是:

var keywords = allWords
    .GroupBy(w => w.keyword)
    .Select(g => new {keyword = g.Key, RecordIDs = g});

这不是我想要的。

结果截图

尝试从g中获取任何东西都会导致错误消息System.Linq.IGropuing<string, UserQuery.KeywordInstance>没有定义[无论我尝试什么]。

我在这里做错了什么?


我可以想象这个问题可能是一个重复的问题,但我一定是搜索了错误的关键词,至少我找到的搜索结果没有帮助到我。 - Rumi P.
我看不出问题——你有一个键,以及所有属于该键的记录?你期望g的记录看起来像什么呢 :) ? - Jens Kloster
@JensKloster 我不关心g的记录是什么样子的。我需要的是一个数据结构,将整数列表'{3, 169, 2179, 2188, 2334, 2389, 2496}'映射到键“FACTOR RECEPTOR”。我想我会使用groupby,但很明显使用错误,得到了g而不是我所需的内容。所以问题是,我该如何正确使用它? - Rumi P.
3个回答

39

我认为你离解决方案很近了。

var keywords = allWords
    .GroupBy(w => w.keyword)
    .Select(g => new 
           { 
              keyword = g.Key, 
              RecordIDs = g.Select(c => c.ID)
           });

只需Select所需记录。
您看到关键字列以及ID列的原因是因为它们是g的一部分。


谢谢,我一直在尝试使用RecordIDs = g.Values.ID这样的方式来实现,从未想过在g上使用嵌套查询。 - Rumi P.
当使用Entity Framework查询时,似乎这并不起作用。我必须使用“where”按每个组键选择记录。 - ed22

1
var keywords = allWords.GroupBy(w => w.keyword);

foreach (var itm in keywords)
{
   var list = itm.ToList();  
   //list returns all of the original properties/values objects from allwords.
   //itm.key returns w.keyword
}

0
一种获取值的方法(但是你会丢失Key)如下所示:
var keywords = allWords
    .GroupBy(w => w.keyword)
    .Select(g => g.FirstOrDefault());

或者一个更简洁的方法:

var keywords = allWords
    .Select(w => w.keyword)
    .Distinct();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接