2014-09-10 42 views
0

我有返回正确值的lambda表达式,但我想分组的项目的总和为好,在这里我的查询组由lambda表达式用C#MVC

IEnumerable<CJTViewModel> objModel = (from q in db.CURRENT_JCT_TRANSACTION 
where q.Job == job 
group q by new { q.Cost_Code, q.Category } into g 
select new CJTViewModel() 
{ 
Job = job, 
Category_E = g.Key.Category == "E" ? g.Sum(s => s.Amount) : 0, 
Category_L = g.Key.Category == "L" ? g.Sum(s => s.Amount) : 0, 
Category_LB = g.Key.Category == "LB" ? g.Sum(s => s.Amount) : 0, 
Category_OH = g.Key.Category == "OH" ? g.Sum(s => s.Amount) : 0, 
Cost_Code = g.Key.Cost_Code, 
Category = g.Key.Category 
}).ToList().OrderBy(x => x.Cost_Code); 

它给了我像下面

 
Cost Code Category  Amount 
------------------------------------------------ 
1001    E  $100 
1001    L  $200 
1001    OH  $120 
1002    L  $100 
1002    LB  $100 
1002    OH  $200 
输出

,但我希望输出像下面

 
Cost Code  Category  Amount 
---------------------------------------------- 
1001    E   $100 
1001    L   $200 
1001    OH   $120 
          ----------------- 
          $420 
1002    L   $100 
1002    LB   $100 
1002    OH   $200 
         ----------------- 
          $400 

任何帮助,将不胜感激..

+0

请出示CJTViewModel'的'定义。它代表行或行组吗? – 2014-09-10 15:01:08

+0

是否要将总计条目作为列表中的另一个项目,其中成本代码和类别为nu​​ll,还是要其他项目? – 2014-09-10 15:01:31

回答

1

您应该使用包含总体和每个给定成本代码类别的详细信息的模型。然后,您应按成本代码对交易进行分组并选择这些模型。在每个成本代码组中,您应该按类别创建另一个分组,并选择包含给定成本代码/类别组摘要的模型。下面是样品与匿名类型:

var query = from t in db.CURRENT_JCT_TRANSACTION 
      group t by t.Cost_Code into g 
      orderby g.Key ascending 
      select new 
      { 
       CostCode = g.Key, 
       Total = g.Sum(t => t.Amount), 
       Categories = 
        from t in g 
        group t by t.Category into cg 
        select new 
        { 
         CostCode = g.Key, 
         Category = cg.Key, 
         Amount = cg.Sum(t => t.Amount) 
        } 
      }; 

输出:

[ 
    { 
    "CostCode": 1001, 
    "Total": 420.0, 
    "Categories": [ 
     { "CostCode": 1001, "Category": "E", "Amount": 100.0 }, 
     { "CostCode": 1001, "Category": "L", "Amount": 200.0 }, 
     { "CostCode": 1001, "Category": "OH", "Amount": 120.0 } 
    ] 
    }, 
    { 
    "CostCode": 1002, 
    "Total": 400.0, 
    "Categories": [ 
     { "CostCode": 1002, "Category": "L", "Amount": 100.0 }, 
     { "CostCode": 1002, "Category": "LB", "Amount": 100.0 }, 
     { "CostCode": 1002, "Category": "OH", "Amount": 200.0 } 
    ] 
    } 
] 
0

你会希望有一个完全不同的查询和视图模型,因为它们是从不同的角度为生成生成项目的第二总和就数据而言。

你可以这样做:

 var groupedValues = viewModels.ToList() 
      .GroupBy(model => model.CostCode, 
       (i, models) => new {CostCode = i, Sum = models.Sum(model => model.Value)}); 

这将创建一个具有成本代码和字段可以访问并显示在您的视图匿名类型。

或者,你也可以声明一个新的视图模型并填充:

public class CostCodeSummaryViewModel 
{ 
    public int CostCode { get; set; } 
    public int Total { get; set; } 
} 


     var groupedValues = viewModels.ToList() 
      .GroupBy(model => model.CostCode, 
       (i, models) => new CostCodeSummaryViewModel {CostCode = i, Total = models.Sum(model => model.Value)});