Linq newbie here, struggling with my first GroupBy
query.
I have a list of objects of type KeywordInstance
which represents a keyword, and the ID of the database record to which the keyword was applied.
Keyword RecordID
macrophages 1
macrophages 2
cell cycle 3
map kinase 2
cell cycle 1
What I want is a collection of all keywords, with a list of the RecordIDs
to which each keyword was applied.
Keyword RecordIDs
macrophages 1, 2
cell cycle 1, 3
map kinase 2
I tried using Linq to get it into a new object. I only managed to get the distinct keywords.
var keywords = allWords .GroupBy(w => w.keyword) .Select(g => new {keyword = g.Key});
The problem is that I can't seem to get the values of g
in any way. g
is of the type IGrouping<String, KeywordInstance>
and by documentation, it only has the property Key
, but not even the property Value
. All the examples I have seen on the Internet for groupby
just tell me to select g
itself, but the result of
var keywords = allWords
.GroupBy(w => w.keyword)
.Select(g => new {keyword = g.Key, RecordIDs = g});
is not what I want.
Any try to get something out of g fails with the error message System.Linq.IGropuing<string, UserQuery.KeywordInstance> does not have a definition for [whatever I tried]
.
What am I doing wrong here?
I think you are close to you solution.
var keywords = allWords
.GroupBy(w => w.keyword)
.Select(g => new
{
keyword = g.Key,
RecordIDs = g.Select(c => c.ID)
});
Just Select
the records you need.
The reason you are seeing the Keyword-column as well as the ID-column, is becuase it's part of g