2016-09-14 5 views
-6

У меня есть сценарий, в котором я получаю имена заголовков (для создания текстового файла) из базы данных. Список будет какСоздание списка в следующем формате

DeptId TeacherId StudentId testname testvalue 

    101 1   501  A   85 
    101 1   501  B   90 
    101 1   502  A   80 
    101 1   502  B   75 
    101 2   502  A   80 
    101 2   502  B   84 
    102 1   503  A   56 
    102 1   503  B   60 

Предполагая, что число испытаний будет таким же (A & B) Выход должен быть как

DeptId TeacherId StudentId A B 
101  1   501  85 90 
101  1   502  80 75 
101  2   502  80 84 
102  1   503  56 60 
+1

И каков ваш реальный вопрос? С чем вы столкнулись? Что вы пробовали до сих пор, и где именно вы застряли? – bassfader

+1

Это называется стержнем. Вы можете google, чтобы найти способы его достижения в SQL или в коде. – juharr

+0

Просто посмотрите здесь: http://stackoverflow.com/questions/167304/is-it-possible-to-pivot-data-using-linq –

ответ

1

Что-то, как это будет работать

var results = from x in context.Tests 
       group x by new { x.DeptId, x.StudentId, x.TeacherId } into grp 
       select new 
       { 
        grp.Key.DeptId, 
        grp.Key.StudentId, 
        grp.Key.TeacherId, 
        A = grp.FirstOrDefault(x => x.TestName == "A")?.TestValue, 
        B = grp.FirstOrDefault(x => x.TestName == "B")?.TestValue 
       }; 

Для этого требуется C# 6 для оператора с нулевым условием ?., но вы можете сделать это вместо

A = grp.Where(x => x.TestName == "A").Select(x => x.TestValue).FirstOrDefault(); 

Вы также можете отфильтровать другие тесты с where после from, чтобы избежать результатов были А и B будет в конечном итоге null, как этот

where x.TestName == "A" || x.TestName == "B" 

Конечно, вы можете по-прежнему заканчиваются нулевыми значениями для A и B, если комбинация DeptId-StudentId-TeacherId имеет только один из этих тестов в вашей БД.

+0

Мы не уверены в именах тестов, пока не получим их из базы данных –

+1

@SillyVolley В этом случае вы можете сделать что-то вроде 'Tests = grp.ToDictionary (x => x.TestName, x => x.TestValue)' вместо этого. Если вы не знаете имена столбцов, создавать их нелегко. – juharr