2016-11-22 96 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