2014年6月27日 星期五

LINQ 動態查詢 LINQKit PredicateBuilder + Glimpse 效能監測

早在 2013 LINQ 動態查詢 就困擾著我

http://weisnote.blogspot.tw/2013/03/dynamic-linq.html

當時找到 Dynamic LINQ

但是組字串並不是個好法子

(要組字串的話 我何不直接用 Pure T-SQL)





曾經與 LINQ 纏鬥過的朋友都知道 動態查詢 很難搞

尤其是 Or

並沒有什麼內建的法子 可以讓你動態來 Or Or Or

要不就寫死 .Where(x => x.Foo == 'Foo' || x.Bar == 'Bar || x.Goo == 'Goo' || x.Nar == 'Nar'')

要不就 Expression Trees 硬幹 像這樣

靠自己 好自在...才怪

賣鬧啊 Expression Trees 學習曲線 可沒比 Regular Expression 低 (雖然小弟兩樣都沒學好)





如今 2014 了 技術是會進步的!!

(其實應該出來滿久的 只是我沒去玩他)

拜讀於此:

援助教技--IT點滴日誌:http://neo-tech-tw.blogspot.tw/2013/08/linq-predicatebuilder.html

繼續沉睡5000年:http://leaflet-t-h.blogspot.tw/2011/11/linq-predicatebuilder.html

Kelp Code:http://kelp.phate.org/2011/12/linq-to-object-linqkitpredicatebuilder.html





鄭重歡迎 ~ LINQKit http://www.albahari.com/nutshell/linqkit.aspx





LINQKit 裡面應該是有不少妖魔鬼怪的 但是今天只來玩 PredicateBuilder 來搞定 Or Or Or

照官網範例 很簡單就 完成了

靠大神 好爽...正解





其中比較讓人困惑的 可能就是這句

var predicate = PredicateBuilder.False<Products>();

它的完整型別長這樣

Expression<Func<Products, bool>> predicate = PredicateBuilder.False<Products>();

更不懂了?? 其實他就下面這東東

Expression<Func<Products, bool>> predicate = x => false;

至於什麼時候用 PredicateBuilder.True<T> 什麼時候用 PredicateBuilder.False<T> 則是看接起來是什麼結果

簡單來說 如果都是 Or 用 PredicateBuilder.False<T> 如果都是 And 用 PredicateBuilder.True<T>





眼尖的考究帝一定有發現瀏覽器下面有一條鬼東西

那是最近神人傳授的好物 Glimpse

不僅美觀 功能更甚 MiniProfiler

Glimpse 官網http://getglimpse.com/Docs/

怎麼裝就不用講了 Nuget~催落去

真要說有什麼缺點的話 大概就是 螢幕太小很麻煩 因為 他內容很多 非常寬 : P

2014年6月22日 星期日

一秒看破 樞紐 查詢 SQL PIVOT UNPIVOT LINQ

什麼是樞紐?






......






DB

弄點假資料(手 KEY 就太傻太天真)

查出來這樣

但是 User 要這樣

硬幹吧 男孩 For~For~For~






多想兩分鐘,你可以不必自殺






官方有解 MS SQL 2005 + 都能玩

http://technet.microsoft.com/zh-tw/library/ms177410(v=sql.105).aspx

SELECT <非樞紐資料行>,

    [第一個樞紐資料行] AS <資料行名稱>,

    [第二個樞紐資料行] AS <資料行名稱>,

    ...

    [最後一個樞紐資料行] AS <資料行名稱>

FROM

    (<產生資料的 SELECT 查詢>)

    AS <來源查詢的別名>

PIVOT

(

    <彙總函式>(<要彙總的資料行>)

FOR

[<包含將變成資料行標頭之值的資料行>]

    IN ( [第一個樞紐資料行], [第二個樞紐資料行],

    ... [最後一個樞紐資料行])

) AS <樞紐分析表的別名>

<選擇性的 ORDER BY 子句>;






WTF...






看圖 (那堆 欄位沒法 直接用 SQL 搞 死心吧 只能靠 C# 組字串)

用 WITH 能略顯風騷???

沒了






等等...UNPIVOT 勒?






官網說 就是把 PIVOT 反過來






WTF...






有張反正規化的表

翻滾吧 Table

沒了






等等...LINQ 勒?






: P






http://abundantcode.com/how-to-create-pivot-data-using-linq-in-c/

http://linqlib.codeplex.com/wikipage?title=Pivot






逃

2014年5月20日 星期二

ASP.NET Web Form 對應優先設計 (Mapping-First Design) 第三彈 - 被遺忘者

PM 常說 先求有 再求好

PG 就說 no problem!

於是三兩下搞定了 CRUD 交給 USER

然後立馬被玩壞

因為 USER 總是能夠超越極限 在 TextBox 裡面塞入無限的可能性

顯而易見 我們需要類似這種東東 防止 USER 的無限加速器全開

或許反射性的就想到工具箱裡面的好碰友...

but that was out of fashion





既然前面兩彈 大費周章的 弄了一個 values mapping system

又在每彈結尾留可有可無的伏筆

自然就是要在上面搞些花招

已達更加無腦的境界





首先從 Map 發想

我希望這樣子來使用欄位驗證

這裡由於驗證可能是複數 所以使用 ICollection

然後陣列可以當作 ICollection 的實體





再來就是 中二到不行的 抽象類 Judgement





之所以不想命名成 validation 之類的 只是因為不想跟 其他欄位驗證的類別混淆

並非因為這個傢伙

或這個傢伙





審判的細節 靠子類實作

至於實作的細節 平常怎麼幹 就怎麼幹囉

隨便貼一個





觸發審判的方式也沒什麼特別

就在 Buster 裡面挖個方法 觸發的時機 高興怎樣就怎樣囉

這邊是在 Buster 放個 IsAllInnocent 屬性 取得該屬性時 會觸發驗證

該死的 Click 事件 獲得了 欄位驗證 並且避免了 重度脂肪肝

Great Success





標題梗 again

2014年5月4日 星期日

ASP.NET Web Form 對應優先設計 (Mapping-First Design) 第二彈 - 百變星君

繼 第一彈 之後 現在再來玩些變化

因為世上無可能有網頁 全部都只用 TextBox 的

在 CheckBox RadioButton DropDownList 參上之前 先來看看 先前第一彈 留下了什麼伏筆




1. 神手會失誤 庸手會失憶

每次都必須宣告 ValueMapBuster 變數 然後在 Page_Load 裡面 SetUpValueMaps Mapping 機制才會奏效

但是 神仙打鼓有時錯 每次都要 Key 這些固定 CODE 實在讓人 KEY 肚藍

所以我們需要 把這些給西 封裝起來 放到基底類裡面

再靠抽象方法 約束後人 必須實作 SetUpValueMaps





2. 噁心的 人形蜈蚣 代碼

什麼是 人形蜈蚣 代碼?

something like...

or like...

咦 好像沒什麼不對呀?

這樣寫的確 沒有任何錯誤 程式依舊能跑

但是這是一個造成 難以維護的 壞味道

如果哪天 條件增加 減少了 勢必要到處去修改這些蜈蚣

況且 這麼多的判斷式 如果只是為了 "其中一種狀況" 發生的時候該做什麼 "對應的事" 的話

其他的 判斷式 在這裡就顯得有點擋路

所以我們需要 善用多型

首先把原本的 ValueMap<T> 變成抽象類


GetValue 和 SetValue 則依靠 抽象方法實作 GetDefaultValue 和 SetDefaultValue 的細節 (就是原本蜈蚣的部分)


再來就是 "多型" 的部分 原先 Mapping 的時候 需要考慮各種控制項的可能

現在則是每種控制項 增加一個獨立的類別 並且繼承 ValueMap<T> 來實作細節

這裡 又會遇到一項設計上的考量 有時候 某個值不見得只靠一種控制項 就能表現

最顯而易見的就是 RadioButton

一群的 RadioButton 實際上只對應某個欄位的列舉值

所以分成 單體 跟 群組 兩種類型的 Map 來應付

單體

TextBoxMap:預設 Map Text 屬性


DropDownListMap:預設 Map SelectedValue 屬性


CheckBoxMap:預設 Map Checked 屬性


HiddenFieldMap:預設 Map Value 屬性


群組

GroupMap:由於是複數控制項表示一欄位值 所以必須要 自行設定 OnGetValue 跟 OnSetValue


CheckGroupMap:專門處裡 RadioButton 或 CheckBox 群組 預設 Map Checked 屬性





上面改了一堆 實際上究竟如何呢? 馬上來把之前的一堆 TextBox 改成 百變星君

首先改 UI 恕我不貼 HTML -.-...


再來當然是...超超超長 Map

呼...好累...然後呢?

什麼然後? * w * ??? 沒有然後了呀

沒錯 Mapping-First 在 Map 完了之後 大半就完成了

除了 SQL 多了些欄位之外 Click 事件內的 Code 無須更動



難道這是傳中的 Two-Way Data Binding!! (誤)




咦?如果我 TextBox 亂打 不合型別會怎樣?

呵呵呵 當然是會壞掉呀 因為現在還沒 實作欄位驗證

敬待 下回分曉 ˊ_>ˋ




Déjà vu?????????????




標題梗: