介紹我們是如何為程式插上Linq的翅膀的?!

2021-04-18 18:20:48 字數 1984 閱讀 7485

rel="file-list" href="file:///c:/docume~1/admini~1/locals~1/temp/msohtml1/01/clip_filelist.xml" />這裡是我對物件導向資料庫的介面定義:

public inte***ce idomain : idisposable

當然其實現方法應該盡量滿足我在

另乙個帖子中的描述。

例如我們要建立乙個系統使用者,同時把它註冊到

「出差不報銷」和

「幹活不拿錢

」兩個使用者組裡邊,我們可以寫:

using(var x=new domain(

伺服器的

endpoint)) ;

var usergroups=from group g in x where g.name=="

出差不報銷

" ¦ ¦ g.name=="

幹活不拿錢

" select g;

usergroup.foreach(g=>

); x.commit(); }

由於物件導向的

orm應該自動儲存緩衝區中的所有「髒

」物件,因此我們並不需要儲存那個

newuser

,儲存(更新)

group

就自動儲存了

newuser。

在idomain

這裡,實際上只有

cast

是新的(相對於資料庫歷史而言),是

linq

給我們帶來的優雅的查詢方案。如果我的資料庫儲存是

datatable

,那麼我只要在乙個

static class

中這樣寫乙個擴充套件方法:

static public ienumable cast (this datatable tbl) where t:user

); return ret; }

這樣就可以在任何地方寫查詢:

datatable tbl= mydatasets.table["users"];

var query=from user u in tbl where u.name=="

張三" select u;

我在idomain

介面中的僅僅

cast

這乙個定義,類似於上面我們對儲存有

user

類物件的

datatable

追加乙個

cast

方法的做法,對於你的任

何原先的資料庫設計只要增加這乙個方法,就跟

linq「

掛上了鉤

」,可以享受到

linq

的功能了。當然,如果你覺得我寫的

datatable

的cast

方法效率不高,可以再使用

queryprovider

的概念去重新設計

cast

(例如返回乙個

iqueryable

型別的結果),使得

query

自己在執行時編譯自己的查詢規劃步驟。但是無論如何,

linq

是非常容易使人對任何「舊的

」資料管理程式

中的查詢進行翻新的。不是只有

linq to sql

之類現成的那幾個類庫才用到了

linq

,我們從自己的「舊的

」資料管理程式出發去擴充套件出

cast

,就能用

linq

處理舊的程式物件了。將舊的物件類

型,看起來完全不可能為了查詢語法改變而重寫一邊的業務型別,很輕便地利用

linq

處理,這才是

linq

的最激動人心的地方!

我們是如何進步的?

前些日子在乙個專案的介紹會上,我向專案組提了乙個問題,為什麼你們不學skype產品選擇普通的客戶端做中繼節點?太麻煩了,他們回答。想想也是,他們把簡單的握手協議都說得很複雜,並認為是很大的難題來處理,自然就不能考慮更多的複雜情況了。想起來了以前看到的一篇文章說,有人說現在如今的計算機產業所依賴的理論...

如何為你的應用程式設定熱鍵?

啟動工程後,在你的工程中新增乙個標準模組,然後將下面的 貼上到模組的宣告段中。option explicit declare function sendmessage lib user32 alias sendmessagea byval hwnd as long,byval wmsg as lon...

我們是如何做敏捷回顧的

回顧 retrospect 是敏捷開發中的乙個必不可少的實踐,也是把整個敏捷開發過程連線成乙個閉環的關鍵節點,本文將闡述我們是如何做敏捷回顧的。敏捷回顧最高指導原則 無論我們發現了什麼,考慮到當時的已知情況 個人的技術水平和能力 可用的資源,以及手上的狀況,我們理解並堅信 每個人對自己的工作都已全力...