LINQ to Entities (Oracle) 中如何使用正規式
我們知道,全形字是 2bytes,半形字是 1byte,那如果我們要找出 Table 中某個欄位的總長度,以 byte 為單位計算,且使用 LINQ 技術,該怎麼處理?
首先當然要知道怎麼找出全形字,很簡單,用以下正規式就解決了:
所以就寫了如下 LINQ 的程式碼,但一執行就出錯了:
LINQ to Entities/SQL 用久了,看到「NotSupportedException」馬上就會認知:這個方式只能使用在 LINQ to Objects。沒錯,上述語法的問題也是如此。雖然 Oracle 資料庫本身有提供正規式的幾個方法,但是 LINQ to Entities (Oracle) 並不會幫我們做這個轉換,因此若一定要從 .Net 程式端處理,最直接的方式,就是先把資料倒回到記憶體中,改用 LINQ to Objects 即可:
這種用法有一個很大的效能問題,也就是把資料倒回記憶體這件事情!若有十萬筆資料要檢查,就要從資料庫取十萬筆回來,這是很可怕的事情,所以若非得回用 LINQ to Objects 才能處理,至少請在倒回記憶體前(ToList),過濾掉一定不會用到的資料和欄位,減少傳輸量。
以本例來說,假設我要查的是超過 40 個全形字(80bytes)的地址,所以我在倒回來時,加上 Where 條件,限制地址欄位全、半形字數加總大於 40 的資料才倒回來,然後再透過第二個 LINQ 表達式,套用正規式將地址換算成 byte 數,最後取回超過 80bytes 的地址資料。
PS1. Oracle 正規式的參考資料請參閱:Oracle Database SQL Functions for Regular Expressions
2012/12/20 補充:
PS2. programlin大有寫一篇Entity Framework - Model-Defined Functions,可以讓我們直接透過 LINQ 存取 MS-SQL 資料庫內建的方法喔,大家可以參考,不過該方式是否適用於 Oracle,要再確認。
--------
沒什麼特別的~
不過是一些筆記而已