DataTable.Compute的巨大功能 【轉】

以前還真沒想到DataTable.Compute具有這麼多的功能

1:聚合函數”Sum()”

2:自由計算表達式“20*30+1

3bool表達式“1=2

4IFF邏輯表達式 IIF(20>1000, 0, 1)” //還支持IsNullTrimSubString

一個小應用:讓DataTable模擬ExcelFormula功能。

Excel中的Formula功能強大,如果能讓DataTable有類似的功能就好了。大部分事件DataTable只是用作數據載體,其實很少用它做計算。DataTable提供的函數Compute就提供了功能強大的計算功能。

Compute函數的參數就兩個:Expression,和Filter

Expresstion是計算表達式,關於Expression的詳細內容請看這裏“http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn.expression(VS.80).aspx”。而Filter則是條件過濾器,類似sqlWhere條件。

1: 這裏詳細介紹的就是Expresstion

先看最簡單的用法,使用聚合函數。這個聚合函數就是報表或者Excel中常用的函數,比如SumAvg等等。對於數據列,Datatable可以方便的進行計算,比如DataTable.Cumpute(“Sum(1)”,”1>0”); 對於簡單的統計功能,這些函數就足夠用了。(其他提供的函數有minmaxcount,求方差,標準偏差等等)。這個功能常用,倒也不奇怪。

再看“自由表達式”計算。把數學計算表達式寫成字符串,然後直接投入Compute函數計算,就可以得到計算結果。這樣,動態生成的計算表達式就可以計算出來了。比方說要計算“列1×30+20+2”或者是純粹的數學計算。

出了計算出具體的結果,Compute函數還能進行邏輯計算。比方說這個表達式就能返回falseCompute(“1=2”,”true”); 這個的用法可能想上邊的情形差不多,在自由組裝一些條件的時候可以得到結果。

Excel中,還經常用到的就是LogicTest功能了,可以指定一些邏輯表達式,比如這樣的:“IF(20>1000, 0, 1)”。而這個功能要是放到DataTable中該如何實現呢?也是用Compute,這樣寫就可以了:“IIF(20>1000, 0, 1)”。

DataTable裏面如果實現“IF(C102=0,0,C105/C102*30)”就用上邊的這些技術點就可以了。

2:至於第二個參數Filter,就是一個簡單的查詢條件。比如,”true”, “Id>4”, “Name like ’%nd’ and sex=’male’”.

條件不可能很複雜,這些已經比較夠用了。

以前用過的Marge什麼的也不錯,還可以作內連接,在數據量小,需要簡單計算的情況下,這些功能很有用。

當然,如果邏輯極其複雜,DT的這點功能就不夠了,還是得自己寫邏輯(即使要實現“IF(C102=0,0,C105/C102*30)”,也是要自己寫一點處理邏輯的,不過比較通用,寫一次就好了)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章