打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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 = from b in dt.AsEnumerable()18                               group b by b.Field<string>("学生") into g19                               let list = g.ToList()20                               select new21                               {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内的语句嫌丑陋,还求高手指导予以修正。

打印结果:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
asp.net Directory生成文件夹
C# 中 Linq 操作 DataTable
ASP.Net 获取当前时间 - zhc088 - 博客园
c# 日期有关的函数
Java笔记(四String和StringBuffer)
从数据库导入到Excel表格
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服