My Linq2Oracle (0)

兩年前因為工作需要一個方便的Oracle資料查詢API,雖然想導入 LINQ to Oracle 的商用套件,不過在評估後因為種種心理因素,以及團隊開發的可控性,只好硬著頭皮自己搞了一個LINQ provider

這個 Provider 是以 ODP.NET 為基礎的,不過最近Oracle官方推出了 Full Managed(託管)版本的 ODP.NET Managed Driver。雖然還是beta版,但部署方便,就順便無痛升級了(自用),也順便寫了自訂的 LINQPad Static Driver/Dynamic Driver(我向來喜歡吃自家的狗糧)

先說明其功能及先天限制:

  • 它沒有 ORM 的功能,只是一個輕量級的資料存取的程式庫
  • 支援Enum:以列舉字串型態支援(所以DB column必須是文字型別)
  • Insert、Update、InsertOrUpdate、Delete的batch作業以Array binding方式實作
  • 每次查詢只能fetch單一table,但可以使用join table filter當作過濾條件
  • 獨特的動態過濾查詢語法
  • 支援實體變更追蹤(for update action)
  • 不支援join in ,而是使用SelectMany(fromfrom …)
  • projection query中不能有區域變數。也就是說只能從DB查詢的結果做運算,不能跟區域變數做運算。
  • group by 查詢結果中的聚合函數目前只支援
  • Average
  • Max
  • Min
  • Sum
  • Count
  • 每個查詢物件,同時代表兩種型別:一個是代表Table Definition,一個是查詢結果的內容元素型別
  • Where條件使用的委派型別是一個Predicate特殊型別。所以只要不是使用到這個版本的Where方法都不會被轉換成SQL 過濾條件,而是本地(local)查詢。
  • Update/Delete Method support optimistic concurrency control
  • Select For Update
  • Static DataContext Driver可以用T4自動從table schema生成,也可以手動撰寫程式碼
  • It look like a freak but it just work.

上面所提到的某些限制追根究柢其實是時間成本的問題,畢竟當初專案進度很趕,剩一個月不到的時間就要實戰演練了,只能先做好有把握的。

這系列文章的目的,只是想讓大家知道:原來LINQ還能這樣玩

完整的原始碼在 Non IQueryable LINQ for ODP.NET

(1) Where
(2) Dynamic Where
(3) OrderBy
(4) SelectMany
(5) Select
(6) Projection
(7) GroupBy with Having

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s