首页 > 代码库 > LINQ构建交叉表
LINQ构建交叉表
最近碰到客户的一个需求。使用交叉表来显示客户数据。也就是以同时以行头和列头交叉形式显示数据内容。同时要求即使有些列没有数据,也需要显示该列内容,并设置默认值。
说明: “交叉表”对象是一个网格,用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成:
- 行
- 列
- 摘要字段
以下是SQL表的数据结构:
学生 | 课程 | 分数 |
王佳佳 | 语文 | 90 |
李晓华 | 语文 | 39 |
王佳佳 | 英语 | 42 |
李建军 | 英语 | 33 |
吴培华 | 数学 | 20 |
这是用于显示的表结构:
学生/课程 | 语文 | 英语 | 数学 | 物理 | 化学 | 地理 |
王佳佳 | 90 | 90 | 90 | 无 | 64 | 无 |
李晓华 | 无 | 69 | 90 | 90 | 无 | 无 |
李建军 | 78 | 83 | 无 | 64 | 无 | 无 |
吴培华 | 93 | 80- | 无 | 无 | 无 | 无 |
“交叉表”中的行沿水平方向延伸(从一侧到另一侧)。在上面的示例中,“课程” 是一行。
“交叉表”中的列沿垂直方向延伸(上下)。在上面的示例中,“学生” 是一列。
汇总字段位于行和列的交叉处。每个交叉处的值代表对既满足行条件又满足列条件的记录的汇总(求和、计数等)。在上面的示例中,“王佳佳”和“英语”交叉处的值是90,表示王佳佳的英语分数。
使用LINQ来筛选数据:
1 static void Main(string[] args) 2 { 3 DataTable dt = new DataTable(); 4 dt.Columns.Add("学生"); 5 dt.Columns.Add("课程"); 6 dt.Columns.Add("分数", typeof(int)); 7 dt.Rows.Add("谢一帆", "语文", 68); 8 dt.Rows.Add("谢一帆", "英语", 58); 9 dt.Rows.Add("谢一帆", "数学", 48); 10 dt.Rows.Add("王佳佳", "英语", 90); 11 dt.Rows.Add("王佳佳", "数学", 91); 12 dt.Rows.Add("王佳佳", "化学", 90); 13 dt.Rows.Add("吴灵敏", "英语", 65); 14 dt.Rows.Add("胡虎珏", "化学", 78); 15 16 17 var groupedData = http://www.mamicode.com/from b in dt.AsEnumerable() 18 group b by b.Field<string>("学生") into g 19 let list = g.ToList() 20 select new 21 { 22 学生 = g.Key, 23 语文 = list.Where(x => x.Field<string>("课程").Equals("语文")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("语文")).Field<int?>("分数").ToString(), 24 英语 = list.Where(x => x.Field<string>("课程").Equals("英语")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("英语")).Field<int?>("分数").ToString(), 25 数学 = list.Where(x => x.Field<string>("课程").Equals("数学")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("数学")).Field<int?>("分数").ToString(), 26 物理 = list.Where(x => x.Field<string>("课程").Equals("物理")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("物理")).Field<int?>("分数").ToString(), 27 化学 = list.Where(x => x.Field<string>("课程").Equals("化学")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("化学")).Field<int?>("分数").ToString(), 28 地理 = list.Where(x => x.Field<string>("课程").Equals("地理")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("地理")).Field<int?>("分数").ToString(), 29 } 30 ; 31 32 groupedData.ToList().ForEach(q => Console.WriteLine(q.学生 + " " + q.语文 + " " + q.英语 + " " + q.数学 + " " + q.地理)); 33 Console.ReadLine(); 34 }
Select内的语句嫌丑陋,还求高手指导予以修正。
打印结果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。