2014-11-02 50 views
0

我想按CategoryId分组,并显示组的CategoryId + Name属性,我需要帮助修改此代码,以便Name属性可以显示,查看下面的视图看看我是什么意思。Linq分组获得多个属性

数据库

ItemCategory
INT项目Id
INT的CategoryId

类别
INT的CategoryId
诠释?的ParentId
字符串名称

var itemcategories = db.Fetch<ItemCategory, Category>(@"SELECT * FROM ItemCategory LEFT JOIN Category on Category.CategoryId = ItemCategory.CategoryId WHERE ItemId = @0", item.ItemId); 


var grouped = from b in itemcategories 
       where b.Category.ParentId != null 
       group b by b.Category.ParentId ?? 0 into g 
       select new Group<int, ItemCategory> { Key = g.Key, Values = g }; 

public class Group<K,T> 
{ 
    public K Key; 
    public IEnumerable<T> Values; 
} 

鉴于

@foreach (var group in @Model.ItemCategories) 
{ 
    @group.Key **Category.Name should be displayed here** 
} 
foreach (var value in group.Values) 
{ 
    @value.Category.Name 
} 
+0

你能更精确的问题是什么?你已经拥有'@ value.Category.Name'。问题是您期望'@ group.Key'成为类别的名称吗? – 2014-11-02 17:37:24

+0

是的,我想@ group.key是类别的名称。 – 2014-11-02 17:58:48

+0

但是你设计Group类的方式是不可能的,因为'Key'的类型是'int','Category.Name'的类型是'string'。那么我们如何做到这一点? – 2014-11-02 18:12:31

回答

0

我认为你正在寻找在这里提供了答案: Group by in LINQ
但是,您还应该更改数据库查询,以便返回实际加入结果,而不仅仅是IEnumerable<ItemCategory>
Group类可能看起来像:

public class Group<K,T> 
{ 
    public K Key; 
    public IEnumerable<T> Values; 
    public IEnumerable<string> CategoryNames; 
} 

需要注意的是,如果你想按ParentId,你的钥匙永远是ParentId,这是GroupBy功能的想法。
使用新的Group类和DB查询,您应该能够使用g.Name作为CategoryNames的参数。