2015-02-24 6 views
1

У меня есть таблица вроде этого. (VisitType динамична)сводной таблицы с помощью Linq

PersonelId  VisitDate  VisitTypeId 
1     2015-02-24  A 
2     2015-02-23  S 
2     2015-02-24  D 
4     2015-02-22  S 
2     2015-02-22  A 
2     2015-02-22  B 
3     2015-02-23  A 
1     2015-02-23  A 
1     2015-02-24  D 
4     2015-02-24  S 
4     2015-02-22  S 
2     2015-02-22  S 
3     2015-02-24  D 

Я хочу, чтобы получить стержень этого с помощью LINQ, как показано ниже.

VisitDate PersonelId  A  S  D  B 
2015-02-22 4    0  2  0  0 
2015-02-22 2    1  1  0  0 
2015-02-23 2    0  1  0  0 
2015-02-23 3    1  0  0  0 
2015-02-23 1    1  0  0  0 
2015-02-24 1    1  0  1  0 
2015-02-24 2    0  0  1  0 
2015-02-24 4    0  1  0  0 
2015-02-24 3    0  0  1  0 

Я использую этот Linq

var d = (from f in _db.Visits 
       group f by new {f.VisitDate, f.PersonnelId } 
        into myGroup 
        where myGroup.Count() > 0 
        select new 
        { 
         myGroup.Key.VisitDate, 
         myGroup.Key.PersonnelId, 
         subject = myGroup.GroupBy(f => f.VisitTypeId).Select 
         (m => new { Sub = m.Count(), Score = m.Sum(c => c.Amount) }) 
        }).ToList(); 

Она сгруппирована по дате и Кадровая ид, но не рассчитывайте элементы из каждого VisitType.

ответ

2

Попробуйте это:

//static headers version 
var qry = Visits.GroupBy(v=>new{v.VisitDate, v.PersonelId}) 
    .Select(g=>new{ 
      VisitDate = g.Key.VisitDate, 
      PersonelId = g.Key.PersonelId, 
      A = g.Where(d=>d.VisitTypeId=="A").Count(), 
      B = g.Where(d=>d.VisitTypeId=="B").Count(), 
      D = g.Where(d=>d.VisitTypeId=="D").Count(), 
      S = g.Where(d=>d.VisitTypeId=="S").Count() 
      }); 

//dynamic headers version 
var qry = Visits.GroupBy(v=>new{v.VisitDate, v.PersonelId}) 
    .Select(g=>new{ 
      VisitDate = g.Key.VisitDate, 
      PersonelId = g.Key.PersonelId, 
      subject = g.GroupBy(f => f.VisitTypeId) 
         .Select(m => new { Sub = m.Key, Score = m.Count()}) 
      }); 
+0

Спасибо, но VisitType Динамический (это внешний ключ другой таблицы) –

+0

Что вы имеете в виду, говоря «VisitType динамична»? –

+0

У меня есть две модели: Visit и VisitType. что visittype является внешним ключом в таблице посещения –

0

первой выборки динамический посещения типа для человека, как следующий

var VisTyp= (from VT in _db.VisitType select new{VisType=VT.VisitType}).ToList(); 

используйте следующие.

var d = (from f in _db.Visits 
    group f by new {f.VisitDate, f.PersonnelId } into myGroup 
    where myGroup.Count() > 0 
    select new 
    { 
      VisitDate = myGroup.Key.VisitDate, 
      PersonnelId = myGroup.Key.PersonnelId, 
      subject=myGroup.Count(t => VisTyp.Contains(t.VisitType)) 
    }).ToList(); 
Смежные вопросы