代码改变世界

LINQ TO SQL学习笔记(8)_实现雷达图

2009-06-18 16:17  宗哥  阅读(3252)  评论(15编辑  收藏  举报

LINQ TO SQL学习笔记(8)_实现雷达图

引言

本文介绍Linq to sql在实际工程中的例子,利用微软chart控件实现调查反馈表的雷达图(Radar Chart)。

系统环境

  1. Visual Studio 2010 +NET Framework 3.5+Microsoft SQL Server 2005+Window XP+ SP3
  2. LINQ TO SQL采用配置式开发
  3. 微软chart控件,微软强大的图表控件参见:http://www.cnblogs.com/zfnh2002,可惜不支持Data Dig功能。

开发背景

  1. 问题提出:
    1. 在MIS系统中,我们会常常会碰到这么一种报表,各个指标的实际值和预期值(或者某一个值的对比)的对比。以教学调查反馈表为例:

      还是很抽象,能不能以一种更加直观的图表方式显示学生对项目经理的实际评价和改指标的差距?:
    2. 雷达图:雷达图(又可称为戴布拉图、螂蛛网图)是财务分析固表的一种。即将一个公司的各项财务分析所得的数字或比率,就其比较重要的项目集中划在一个圆形的固表上, 来表现一个公司各项财务比率的情况,使用者能一目了然的了解公司各项财务指标的变动情形及其好坏趋向。随着计算机技术发展,应用到各项功能。
      先看下做好的效果:

      相对于抽象的报表,是不是很直观。管理者和当事者本身一目了然自己各个指标的基本情况及和预计差距。

设计开发

  1. 业务建模:
    1. 业务设计
      基本上,反馈调查我们都有接触过,我们把调查的指标抽取放到一个表,对于调查反馈回来的问卷我们把他另外放到一个表,采取反数据库范式的数据冗余的方法,方便以后数据挖掘。
    2. 概念数据建模
      以前用PD只用PDM,前段时间因为买了正版的PowerDesigner,Sysbase公司的人给培训下,Show下现学的CDM功能,对于调查反馈,如下:

    3. 数据库建模
      PowerDesigner直接可以从CDM转换为PDM,我们使用LINQ to SQL开发,省略了OOM部分,OOM也是可以直接生成的,对于写文档头疼的程序员来说是个福音。生成的PDM如下:

  2. LINQ to SQL开发:
    1. 生成DBML文件
      采用配置的方式进行Linq to SQL开发,生成DBML,命令如下 sqlMetal /conn:server=.;database=ZXKP;uid=sa;pwd=1 /DBML:D:\ZXKP.dbml /namespace:DMN /serialization:Unidirectional ,把生成的DBML文件加到你的工程中,生成的类图如下: 对于PowerDesigner生成的图,觉得豪华点。

    2. 为Radar 图生成数据源
      我们在数据库设计的时候采用反范式的冗余的实际,对于考评各个指标项目,我们只要统计填写过的反馈表就可以了。
       Chart1.Titles[0].Text = extCbPM.SelectedItem.Text + "技能分布图";
              List
      <decimal?> yValues = new List<decimal?>();
              List
      <string> xValues = new List<string>();
              
      string pmCode = extCbPM.SelectedItem.Value.Substring(0,extCbPM.SelectedItem.Value.IndexOf("|"));
              
      string no = extCbPM.SelectedItem.Value.Split(new Char[] { '|','|' })[1];
              EvaluateBill_AnswerDetailDAL db 
      = new EvaluateBill_AnswerDetailDAL();
              EvaluateBill_AnswerDetail pp 
      = new EvaluateBill_AnswerDetail();
              
      //选择该项目经理调查表的所有反馈
              IList<EvaluateBill_AnswerDetail> source = db.Where(o => o.EvaluateBill_Answer.EvaluateBill.NO == no && o.EvaluateBill_Answer.EvaluateBill.PMCode == int.Parse(pmCode));
              
      //按照
              var q =  from p in source
              group p by p.Describe into g
              select 
      new
              {
              zb 
      = g.Key.Substring(0, g.Key.Length > 10 ? 10 : g.Key.Length)+"",
              AveragePrice 
      = g.Average (oo=>oo.Score)
              };
              
      foreach (var p in q)
              {
              yValues.Add(
      decimal.Parse(p.AveragePrice.Value.ToString("F")));
              xValues.Add(p.zb);
              }
              
      //设定数据源
              Chart1.Series["Series1"].Points.DataBindXY(xValues, yValues);
              
      //雷达图Style设置
              Chart1.Series["Series1"]["RadarDrawingStyle"= "Area";
              Chart1.Series[
      "Series1"].BorderColor = Color.FromArgb(100100100);
              Chart1.Series[
      "Series1"].BorderWidth = 1;
              Chart1.Series[
      "Series1"]["AreaDrawingStyle"= "Circle";
              Chart1.Series[
      "Series1"]["CircularLabelsStyle"= "Horizontal";

结束语

  1. 微软的Chart在Net.3.5中可以免费使用,LINQ to SQL可以很方便的按照我们的更自然化贴近业务描述的写法去实现业务功能,很优雅。
;