LINQ查询(Group BY)一列

时间:2015-07-14 17:27:37

标签: c# linq

考虑以下课程

public class DashboardTile
{
    public int ID { get; set; }
    public int? CategoryID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class DashboardTileBO : DashboardTile
{
    public bool IsChecked { get; set; }
    public List<DashboardTileBO> DashboardTiles { get; set; }
}

我有一些瓷砖列表,其中一些瓷砖是其他瓷砖的子。现在我想以这样一种方式显示我的瓷砖列表,如果它有子节点,它会被添加到列表中。

查询我正在尝试

 var allDashBoardTiles = (from a in context.DashboardTiles
                                         group a by a.CategoryID into b 
                                         select new BusinessObjects.DashboardTileBO
                                         {
                                             ID = a.ID,
                                             Name = a.Name,
                                             Description = b.Description,
                                             DashboardTiles = b.ToList(),
                                         }).ToList();

            var list = context.DashboardUserTiles.Where(a => a.UserID == userId).Select(a => a.DashboardTileID).ToList();

            allDashBoardTiles.ForEach(a => a.IsChecked = list.Contains(a.ID));

现在在上面的查询中,当我使用group子句时,如果我使用a.ID,a.Name等,则表示它不包含它的定义或扩展方法。

enter image description here

1 个答案:

答案 0 :(得分:0)

您无法直接访问a的属性,因为GroupBy会返回IGrouping<TKey,T>。您也可以在组中包含其他列,并按如下方式访问它们: -

 (from a in context.DashboardTiles
 group a by new { a.CategoryID, a.ID, a.Name } into b 
 select new BusinessObjects.DashboardTileBO
        {
            ID = b.Key.ID,
            Name = b.Key.Name,
            DashboardTiles = b.ToList(),
        }).ToList();

修改

另外,我想DashboardTiles类中的属性DashboardTileBO应该是List<DashboardTile>而不是List<DashboardTileBO>,否则我们无法从DashboardTiles数据中获取它。