LINQ - Is there a way to get element values after grouping without ForEach?
I have an Items table that contains a CategoryId field. This is an FK into a Categories table. I want to group my Items by CategoryId and return the Items and Categories.Name.
I know I can do this in C#:
var ItemsByCat =
from i in Items
group i by i.CategoryId i开发者_JAVA百科nto g
select g
foreach(var n in ItemsByCat)
{
blah, blah
}
My question is - is there a way to get at the element values part of the grouping without having to iterate through with a loop? Something like:
from i in Items
group i by i.CategoryId into g
select new {
CategoryID = g.Key,
CategoryName = ???,
Items = ???
}
Many thanks,
BK
I think this is what you're looking for:
from i in Items
group i by i.CategoryId into g
select new
{
CategoryID = g.Key,
CategoryName = g.First().Category.Name,
Items = g
}
EDIT: I hope this answers your question from the comments.
g
is a collection of Items grouped by their CategoryId
. Items
in the select
can be a projection including whatever subset of Item
properties you require. Example:
from i in Items
group i by i.CategoryId into g
select new
{
CategoryID = g.Key,
CategoryName = g.First().Category.Name,
Items = g.Select(a => new{a.ItemID, a.ItemName})
}
What about joining the Categories table?
from i in Items
join c in Categories on i.CategoryId equals c.Id
group i by i.CategoryId into g
select new {
CategoryID = g.Key,
CategoryName = c.Name,
Items = i
}
CategoryName
should be i.Category.CategoryName //the name property
given you have the relationship setup properly.
The items should be the values of group by, not sure why you'd need to do it again.
Assuming you have a collection of Categories in a variable categories it would look like this:
var ItemsByCategory =
from i in items
join c in categories on i.CategoryId equals c.Id
group i by i.CategoryId into g
select new {
CategoryId=g.Key,
CategoryName=c.Name,
Items=g.Items
}
精彩评论