LINQ - Есть ли способ получить значения элементов после группировки без ForEach? - PullRequest
0 голосов
/ 08 октября 2011

У меня есть таблица Items, которая содержит поле CategoryId.Это FK в таблице категорий.Я хочу сгруппировать мои Предметы по CategoryId и вернуть Предметы и Categories.Name.

Я знаю, что могу сделать это в C #:

var ItemsByCat = 
    from i in Items
    group i by i.CategoryId into g
    select g

foreach(var n in ItemsByCat)
{
    blah, blah
}

Мой вопрос - есть ли способполучить в элементах значения части группировки без необходимости перебирать цикл?Что-то вроде:

from i in Items
group i by i.CategoryId into g
select new {
    CategoryID = g.Key,
    CategoryName = ???,
    Items = ???
}

Большое спасибо,

BK

Ответы [ 4 ]

1 голос
/ 08 октября 2011

Я думаю, это то, что вы ищете:

from i in Items
group i by i.CategoryId into g
select new 
{
    CategoryID = g.Key,
    CategoryName = g.First().Category.Name,
    Items = g
}

РЕДАКТИРОВАТЬ: Я надеюсь, что это отвечает на ваш вопрос из комментариев.

g представляет собой набор элементов сгруппированыих CategoryId.Items в select может быть проекцией, включающей любое подмножество Item свойств, которые вам требуются.Пример:

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})
}
0 голосов
/ 08 октября 2011

CategoryName должно быть i.Category.CategoryName //the name property

, если вы правильно настроили отношения.

Элементы должны быть значениями группы, не знаю, зачем вам нужно это делать снова.

0 голосов
/ 08 октября 2011

Если у вас есть коллекция категорий в категории переменных, это будет выглядеть так:

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
}
0 голосов
/ 08 октября 2011

Как насчет присоединения к таблице категорий?

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
}
...