如何使用C#通过LINQ构建数据透视表

4

我在我的c#代码中有这个datatable:

Date     | Employee | Job1 | Job2 |  Job3 |
---------|----------|------|------|-------|
1/1/2012 | A        | 1.00 | 1    |  1    |
1/1/2012 | B        | 2.5  | 2    |  2    |
1/1/2012 | C        | 2.89 | 1    |  4    |
1/1/2012 | D        | 4.11 | 2    |  1    |
1/2/2012 | A        | 3    | 2    |  5    |
1/2/2012 | B        | 2    | 2    |  2    |
1/2/2012 | C        | 3    | 3    |  3    |
1/2/2012 | D        | 1    | 1    |  1    |
1/3/2012 | A        | 5    | 5    |  5    |
1/3/2012 | B        | 2    | 2    |  6    |
1/3/2012 | C        | 1    | 1    |  1    |
1/3/2012 | D        | 2    | 3    |  4    |
2/1/2012 | A        | 2    | 2    |  2    |
2/1/2012 | B        | 5    | 5    |  2    |
2/1/2012 | D        | 2    | 2    |  2    |
2/2/2012 | A        | 3    | 3    |  3    |
2/2/2012 | B        | 2    | 3    |  3    |
3/1/2012 | A        | 4    | 4    |  2    |

现在我想创建另一个DataTable,它应该长这样:
Job1    
Employee | 1/1/2012 | 1/2/2012 | 1/3/2012 | 2/1/2012 | 2/2/2012 |
---------|----------|----------|----------|----------|----------|
A        | 1.00     | 3        | 5        | 2        | 3        |
B        | 2.50     | 2        | 2        | 5        | 2        |
C        | 2.89     | 3        | 1        | -        |          |
D        | 4.11     | 1        | 2        | 2        |          |
Total    | 10.50    | 9        | 10       | 9        | 5        |

请建议如何使用Linq和C#制作这个透视表。

5
不冒犯任何人,我认为“你尝试过了”这个座右铭并不一定适用于所有直接的问题。当我们不知道如何继续时,我们该如何表明我们已经尝试过了? - Larry
1
可能是从DataTable创建数据透视表的重复问题。 - Gert Arnold
2个回答

5
var query = from foo in db.Foos
            group foo by foo.Date into g
            select new {
                Date = g.Key,
                A = g.Where(x => x.Employee == "A").Sum(x => x.Job1),
                B = g.Where(x => x.Employee == "B").Sum(x => x.Job1),
                C = g.Where(x => x.Employee == "C").Sum(x => x.Job1),
                D = g.Where(x => x.Employee == "D").Sum(x => x.Job1),
                Total = g.Sum(x => x.Job1)
            };

您还可以对查询应用 OrderBy(x => x.Date)

谢谢您的回复,由于我不太了解LINQ,所以我的问题是什么是db.foos?另外,我不能硬编码员工姓名,因为它们是动态的。 - user1254053
@user1254053 嗯,从你的问题中我怎么知道呢?你甚至没有指定数据库表的名称,这就是为什么我使用了 Foo。而 db 变量则是你的 DbContext(我相信你使用的是 EF 4.1 或更高版本)。 - Sergey Berezovskiy
2
@lazyberezovsky 在你的答案中,员工姓名是静态的,是否可以使其成为动态列呢,因为我不知道员工姓名,也无法硬编码它们。 - Haider Ali Wajihi

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接