我有一个场景,我将从数据库收到标题名称(用于创建文本文件)。 该列表将类似于
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
答案 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的空值。