系統環境
本文介紹Linq to sql在實際工程中的例子,利用微軟chart控件實現調查反饋表的雷達圖(Radar Chart)。
系統環境
Visual Studio 2010 +NET Framework 3.5+Microsoft SQL Server 2005+Window XP+ SP3
LINQ TO SQL采用配置式開發
微軟chart控件,微軟強大的圖表控件參見:http://www.cnblogs.com/zfnh2002,可惜不支持Data Dig功能。
開發背景
問題提出:
在MIS系統中,我們會常常會碰到這麼一種報表,各個指標的實際值和預期值(或者某一個值的對比)的對比。以教學調查反饋表為例:
還是很抽象,能不能以一種更加直觀的圖表方式顯示學生對項目經理的實際評價和改指標的差距?:
雷達圖:雷達圖(又可稱為戴布拉圖、螂蛛網圖)是財務分析固表的一種。即將一個公司的各項財務分析所得的數字或比率,就其比較重要的項目集中劃在一個圓形的固表上, 來表現一個公司各項財務比率的情況,使用者能一目了然的了解公司各項財務指標的變動情形及其好壞趨向。隨著計算機技術發展,應用到各項功能。
先看下做好的效果:
相對於抽象的報表,是不是很直觀。管理者和當事者本身一目了然自己各個指標的基本情況及和預計差距。
設計開發
業務建模:
業務設計
基本上,反饋調查我們都有接觸過,我們把調查的指標抽取放到一個表,對於調查反饋回來的問卷我們把他另外放到一個表,采取反數據庫范式的數據冗余的方法,方便以後數據挖掘。
概念數據建模
以前用PD只用PDM,前段時間因為買了正版的PowerDesigner,Sysbase公司的人給培訓下,Show下現學的CDM功能,對於調查反饋,如下:
數據庫建模
PowerDesigner直接可以從CDM轉換為PDM,我們使用LINQ to SQL開發,省略了OOM部分,OOM也是可以直接生成的,對於寫文檔頭疼的程序員來說是個福音。生成的PDM如下:
LINQ to SQL開發:
生成DBML文件
采用配置的方式進行Linq to SQL開發,生成DBML,命令如下 sqlMetal /conn:server=.;database=ZXKP;uid=sa;pwd=1 /DBML:D:\ZXKP.dbml /namespace:DMN /serialization:Unidirectional ,把生成的DBML文件加到你的工程中,生成的類圖如下: 對於PowerDesigner生成的圖,覺得豪華點。
為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(100, 100, 100); Chart1.Series["Series1"].BorderWidth = 1; Chart1.Series["Series1"]["AreaDrawingStyle"] = "Circle"; Chart1.Series["Series1"]["CircularLabelsStyle"] = "Horizontal";
結束語
微軟的Chart在Net.3.5中可以免費使用,LINQ to SQL可以很方便的按照我們的更自然化貼近業務描述的寫法去實現業務功能,很優雅。