2016-11-22 97 views
1

我的表像之下集团项目和计算

Main_ID | Child_ID | Activity | 
1  |1   | Start  
1  |2   | Stop  
1  |3   | Stop  
2  |1   | Start 
2  |3   | Stop 

我正在寻找的是像

Main_ID | Start | Stop 
1  |1  |2 
2  |1  |1 

所以,在第一列我想列出所有Main_Ids和不同活动水平。之后,我希望在Main_ID的每个活动下显示不同的Child_Ids的数量。

我已经试过是

var result = from q in db.Table 
    where q.Child_ID != null 
    group 1 by new { q.Main_ID,q.Child_ID, q.Activity } into g 
    select new MyList 
    { 
     Main_ID = g.Key.Main_ID, 
     Child_ID = g.Key.Child_ID, 
     Activity = g.Key.Activity, 
     Count = g.Count() 
    } 
    into p orderby p.Main_ID,p.Child_ID select p; 

但有了这个,我没有得到什么,我已经指出。

我已经使用了Child_ID实现以下

​​

不知道如何来显示它反对Main_ID

+0

你应该给这个 – rbr94

回答

0

所有,

感谢您的帮助。

我能做到这一点使用以下

var v = from q in myTable 
       where q.Child_ID != null 
       orderby q.ModifiedDate descending 
       select q; 

     var result2 = v 
      .GroupBy(g => new 
     { 
      g.Main_ID 
     }) 
     .Select(grp => new MyClass 
     { 
      Main_ID = grp.Key.Main_ID, 
      StartCount = grp.Where(x=> x.Activity == "Start").Select(x => x.Child_ID).Distinct().Count(), 
      StopCount = grp.Where(x => x.Activity == "Stop").Select(x => x.Child_ID).Distinct().Count() 
     }); 

我得到使用这种预期resuts。

现在;我想知道这是否是正确的方法,如果两个查询可以合并。

因为它有代码,所以没有发表评论;对不起:-)

3

考虑这个类:

public class Foo 
{ 
    public int Main_ID {get;set;} 
    public int Child_ID {get;set;} 
    public string Activity {get;set;} 
} 

有了这些数据:

var ls=new List<Foo> 
    { 
     new Foo{Main_ID=1,Child_ID=1,Activity="Start"}, 
     new Foo{Main_ID=1,Child_ID=2,Activity="Stop"}, 
     new Foo{Main_ID=1,Child_ID=3,Activity="Stop"}, 
     new Foo{Main_ID=2,Child_ID=1,Activity="Start"}, 
     new Foo{Main_ID=2,Child_ID=3,Activity="Stop"}, 
    }; 

你可以这样做:

var result = ls 
    .GroupBy (g =>g.Main_ID) 
    .Select (g =>new 
    { 
     Main_ID = g.Key, 
     Start = g.Where(s=>s.Actvity == "Start").Select(x => x.Child_ID).Distinct().Count(), 
     Stop = g.Where(s=>s.Actvity == "Stop").Select(x => x.Child_ID).Distinct().Count(), 
    } 
    ).ToList(); 

结果:

Main_ID Start Stop 
1  1  2 
2  1  1 
+2

增加一个'linq'标记多于g。用g来代替g.Sum(s-> s.Acitvity ==“Start”?:1:0) Count(s => s.Actvity =“开始”); – Marwijn

+0

谢谢。将尝试这一点,但这会给我计数的DISTINCT Child_Id项目Main_ID和活动的组合吗? – A3006

+0

@Arion - 这实际上给了我每个活动组的数量。但是我需要更进一步的地方,我希望计数不同的Chld_Id,但这不适用于此。 – A3006