根据某一字段对数据进行分组统计

如何根据某一字段对数据进行分组统计?
在项目要求中要求实现此页面功能
在这里要求统计公司20GP,40GP,40HC的柜量和TEU情况,
根据某一字段对数据进行分组统计
下面是我实现此功能的页面
根据某一字段对数据进行分组统计
啊啊,页面设计不好看,虽然实现的内容与要求的有些许差异,但是分组查询统计的功能是实现了
下面是我经过思考编写的代码(在这里引用了BsgridPage)

// An highlighted block
public ActionResult Statistics(BsgridPage bsgridPage, int EntrustID, string WorkNumber, string StarDate, string EndDate,
             int PretendHarborID, int PurposeID, string ShipID, string ShipNext)//柜型柜量统计
        {
            #region
            try
            {
                var lisqtem = (from tbSetBox in myModels.SYS_Setbox
                                   //group by分组
                                   //group tbSetBox by tbSetBox.ShipcompanyID into tbShipcommanpay 
                                   //表示对tbSetBox按ShipcompanyID字段归类,其结果命名为tbShipcommanpay 
                                   //一旦重新命名,tbSetBox的作用域就结束了,所以,最后select时,
                               group tbSetBox by tbSetBox.ShipcompanyID into tbShipcommanpay
                               select new
                               {
                                   ShipcompanyID = tbShipcommanpay.Key,//接口提供一个属性 Key ,返回进行分组的关键字段的值
                                   TEU = tbShipcommanpay.Select(m => m.TEU),
                                   Score20GP = tbShipcommanpay.Where(m => m.Boxmodel == "20GP"),
                                   Score40GP = tbShipcommanpay.Where(m => m.Boxmodel == "40GP"),
                                   Score40HC = tbShipcommanpay.Where(m => m.Boxmodel == "40HC"),
                               }).ToList();

                var linqteml = (from tbSetBox in lisqtem
                                join tbShipcompany in myModels.SYS_Shipcompany on tbSetBox.ShipcompanyID equals tbShipcompany.ShipcompanyID
                                join tbShip in myModels.SYS_Ship on tbShipcompany.ShipID equals tbShip.ShipID
                                join tbWorkNumber in myModels.SYS_WorkNumber on tbShip.WorkNumberID equals tbWorkNumber.WorkNumberID
                                join tbEntrust in myModels.SYS_Entrust on tbShip.EntrustID equals tbEntrust.EntrustID
                                orderby tbSetBox.ShipcompanyID descending
                                select new SetBoxVo
                                {
                                    ShipcompanyID = tbShipcompany.ShipcompanyID,
                                    ShipName = tbShip.ShipName,
                                    ShipcompanyMC = tbShipcompany.ShipcompanyMC,
                                    Score20GP = tbSetBox.Score20GP.Count(),
                                    Score40GP = tbSetBox.Score40GP.Count(),
                                    Score40HC = tbSetBox.Score40HC.Count(),
                                    TEU = tbSetBox.TEU.Count(),
                                    Date = tbShip.DateShip.ToString(),
                                    DateShip = tbShip.DateShip,
                                    WorkNumber = tbWorkNumber.WorkNumber,
                                    EntrustMC = tbEntrust.EntrustMC,
                                    ShipNext = tbShip.ShipNext,
                                    EntrustID = tbEntrust.EntrustID,
                                    ShipID = tbShip.ShipID,
                                }).ToList();
                if (EntrustID > 0)
                {
                    linqteml = linqteml.Where(m => m.EntrustID == EntrustID).ToList();
                }
                if (PretendHarborID > 0)
                {
                    linqteml = linqteml.Where(m => m.PretendHarborID == PretendHarborID).ToList();
                }
                if (!string.IsNullOrEmpty(ShipID))
                {
                    linqteml = linqteml.Where(m => m.ShipName.Contains(ShipID)).ToList();
                }
                if (PurposeID > 0)
                {
                    linqteml = linqteml.Where(m => m.PurposeID == PurposeID).ToList();
                }
                if (!string.IsNullOrEmpty(WorkNumber))
                {
                    linqteml = linqteml.Where(m => m.WorkNumber.Contains(WorkNumber)).ToList();
                }
                if (!string.IsNullOrEmpty(ShipNext))
                {
                    linqteml = linqteml.Where(m => m.ShipNext.Contains(ShipNext)).ToList();
                }
                if (!string.IsNullOrEmpty(StarDate) && !string.IsNullOrEmpty(EndDate))
                {
                    DateTime starDate = Convert.ToDateTime(StarDate);
                    DateTime endDate = Convert.ToDateTime(EndDate);
                    linqteml = linqteml.Where(m => m.DateShip >= starDate && m.DateShip <= endDate).ToList();
                }
                int totals = linqteml.Count();
                List<SetBoxVo> listSet = linqteml
                    .Skip(bsgridPage.GetStartIndex())
                    .Take(bsgridPage.pageSize).ToList();
                Bsgrid<SetBoxVo> bsgrid = new Bsgrid<SetBoxVo>
                {
                    success = true,
                    totalRows = totals,
                    curPage = bsgridPage.curPage,
                    data = listSet
                };
                return Json(bsgrid, JsonRequestBehavior.AllowGet);
                #endregion
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return Json("", JsonRequestBehavior.AllowGet);
        }