2016-11-22 5 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.

То, что я пытался это

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 с помощью следующего

var result2 = result.GroupBy(x => x.Child_ID) 
    .Select(grp => new MyList2 
    { 
     Child_ID = grp.Key, 
     StartCount = grp.Where(x => x.Activity == "Start") 
      .Select(x => x.Count).Cast<Int32>().FirstOrDefault(), 
     StopCount = grp.Where(x => x.Activity == "Stop") 
      .Select(x => x.Count).Cast<Int32>().FirstOrDefault() 
    }); 

Не знаю, как отобразить его против Main_ID

+0

Вы должны добавить больше, чем тег 'linq' к этому – 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

Как насчет замены g.Sum (s-> s.Acitvity ==" Start "?: 1: 0) на g. Count (s => s.Actvity = "Start"); – Marwijn

+0

Спасибо. Попробуете это, но это даст мне количество элементов DISTINCT Child_Id для комбинации Main_ID и Activity? – A3006

+0

@Arion - Это на самом деле дает мне оценку в соответствии с группами по активности. Но мне нужен еще один уровень, где я хочу подсчитать количество Chld_Id, которое не работает с этим. – A3006