2017-10-17 46 views
4

我正在写一个C#LINQ查询从SQL表中获取数据低于LINQ查询到数据放在一个嵌套的对象

表1

Id Status SubStatus 
1 Review Pending 
2 Review Complete 
3 Review Approved 
4 Review Denied  
5 Info Processing 
6 Info Pending 
7 Info Requested 
8 Info Received 
9 Approval Approved 
10 Review Approved 

从上表的工作,我想放在一个对象中的数据如下面

public class LastStatusDto 
    { 
     public string StatusName { get; set; } 
     public int StatusId { get; set; } 
     public int Count { get; set; } 
     public IEnumerable<LastStatusChildDataDto> drillDownData { get; set; } 
    } 

public class LastStatusChildDataDto 
{ 
    public string SubStatusName { get; set; }  
    public int Count { get; set; } 
} 

和样本结果(状态“评论”)看起来像下面

  { 
       "statusName": "Review", 
       "statusId": 0, 
       "count": 5, 
       "drillDownData": 
       [{ 
       "subStatusName":"Approved", 
       "count":2 
       }, 
       { 
       "subStatusName":"Complete", 
       "count":1 
       }, 
      { 
       "subStatusName":"Pending", 
       "count":1 
       }, 
       { 
       "subStatusName":"Denied", 
       "count":1 
       }, 
      ] 
     } 

对于上面的场景,写一个LINQ查询是一个好方法。我试图通过status分组,但没能想出一个办法把substatuses在嵌套对象像下面

var res = from status in context.Table1 
      group status by status.Status into s 

      select new LastStatusDto 
      { 
       Count = s.Count(), 
       StatusName = s.Key, 
       drilldownData = {/* ? */}       
      }; 
+0

为什么'StatusId'是LastStatusDto的一个属性? – JuanR

回答

4

这应做到:

var res = table1.GroupBy(t => t.Status) 
      .Select(g => new LastStatusDto() 
      { 
       StatusId = 0, 
       StatusName = g.Key, 
       Count = g.Count(), 
       drillDownData = g.GroupBy(s => s.SubStatus) 
        .Select(st => new LastStatusChildDataDto() 
        { 
         SubStatusName = st.Key, 
         Count = st.Count() 
        }) 
      }); 

正如我在上面的评论中提到,StatusId有没有地方作为LastStatusDto的财产,因为它是一个集合,所以我将它设置为0只是为了与您的结构相匹配。

+0

有道理!谢谢 – DoIt