以下列格式生成列表

时间:2016-09-14 11:59:19

标签: c# linq

我有一个场景,我将从数据库收到标题名称(用于创建文本文件)。 该列表将类似于

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 个答案:

答案 0 :(得分: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过滤掉其他测试,以避免结果A和B最终都是null,就像这样

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

当然,如果DeptId-StudentId-TeacherId组合只在数据库中有一个这样的测试,你仍然可以得到A和B的空值。