2011-10-07 133 views
0

我有一个包含CategoryId字段的项目表。这是一个分类表中的FK。我想通过CategoryId对我的Items进行分组并返回Items和Categories.Name。LINQ - 有没有办法在没有ForEach的情况下获得元素值?

我知道我可以在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

+0

这是Linq to Entities吗? –

回答

1

我认为这是你在找什么:

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分组的项目的集合。 Itemsselect可以包括你需要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

嗯,我明白了 - 所以g是一个集合,通过使用.First()我可以抓住CategoryName。非常感谢!确切地说,是 – BKahuna

+0

。 g是实现“IEnumerable”的另一种类型的集合。我很高兴获得帮助。 – Sorax

+0

最后一个问题 - 如果在选择项目是与Items.ItemID,Items.Name对象的集合?换句话说,我不想返回整个Items记录的集合,只是Items字段的一个子集。 – BKahuna

0

怎么样加入分类表?

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

CategoryName应该i.Category.CategoryName //the name property

给你有关系的正确安装。

的项目应该是组的值通过,不知道为什么你需要再做一次。

+0

分组后,我不再在范围内。我所有的工作都是g。 – BKahuna

+0

是的,这就是我的意思,g中每个项目的值是按项目分组的。每个分组的条目都有一个键和项目(这是你的项目,哈哈) –

0

假设你有分类的变量类别的集合,将是这样的:

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

这假设你没有使用实体框架。在EF中,您只需走动导航属性即可,无需连接。 –

+0

我认为一旦我进行分组,就会超出范围。如果我将连接移动到分组下面并加入到c.CategoryId = g.Key上的类别,它似乎可以工作。这是一个好方法吗? – BKahuna

+0

这很好......我觉得很奇怪,这是行不通的其他方式,虽然,但它也许是它得到解析的方式。 –

相关问题