2016-09-14 52 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

這被稱爲數據透視表。你可以谷歌,找到方法來實現它在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(); 

您也可能希望在from後,用where過濾掉其他測試,以避免結果分別爲A和B都將最終被null,這樣

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

當然你可以仍然如果DeptId-StudentId-TeacherId組合只在您的數據庫中包含其中一項測試,則結束A和B的空值。

+0

我們不確定測試名稱,直到我們從數據庫中得到那些 –

+1

@SillyVolley在這種情況下,你可以像'Tests = grp.ToDictionary(x => x.TestName,x => x.TestValue)''做一些事情。如果你不知道列名,那麼創建它們並不容易。 – juharr