以下列格式生成列表

本文关键字:列表 格式 | 更新日期: 2023-09-27 18:07:08

我有一个场景,我将从数据库接收头名称(用于创建文本文件)。列表将像

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

以下列格式生成列表

这样就可以了

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的空值结束。