LINQ in Action 一書第一章翻譯原稿

2021-08-23 12:45:58 字數 3842 閱讀 2952

linq in action 一書第一章翻譯原稿

前言第一章 開始入門

本章引入 linq 技術和了 c# 和 vb 語言增強功能。章一列出 linq、 其歷史、 使用物件、 xml

和 sql ,和快速 「 hello world 」 示例。 第 2 章引入了所有提供最新版本的 c# 和 vb.net,

要啟用 linq 的新的語言功能。 第 3 章涵蓋 linq 的技術基礎,並顯示它們如何結合在一起。

第一節 簡介

本節包括

linq 的起源

linq 的設計模式

第一步 linq to objects, linq to xml,和 linq to sql

1.1.3 作為語言擴充套件的 linq

您可以通過linq來編寫針對各種資料來源的查詢訪問資訊。您不必在使用sql語法,因為linq提供了c#語言來處理,並提供了相同的型別及表達的功能。這是很重要的因為像乙個 linq 提供了乙個宣告性方法允許您編寫更物件導向的程式。

列表 1.1 顯示示例 可以使用 linq編寫c# **。

列出使用 linq 查詢資料庫,並建立 xml 文件的 1.1 示例**

var contacts = ---------------從資料庫檢索客戶表

from customer in db.customers

where customer.name.startswith("a") && customer.orders.count > 0

orderby customer.name

select new ;

var xml = ---------------從客戶列表生成 xml 資料

new xelement("contacts",

from contact in contacts

select new xelement("contact",

new xattribute("name", contact.name),

new xattribute("phone", contact.phone)

));

這段**含義是從資料庫中提取資料並從中建立乙個 xml 文件寫入所需內容。使用linq您會感覺到更容易、更自然。您將很快看到更多 linq 查詢,但目前集中在語言方面。與from, where, orderby,和select 關鍵字在表裡,很明顯他們已經擴充套件進c#的linq工具裡。

我們剛才所展示的是 c# **,但 linq 跨程式語言提供常見查詢體系結構。他工作在 c# 3.0 and vb.net 9.0 (即 vb 2008),因此需要專用的編譯器,但是,可以其移植到其他.net 語言。從目前來看f#已經有了linq功能,未來會有更多.net語言得到linq的支援。

圖 1.2 顯示用於**物件、 xml 或資料表的典型語言整合查詢。

圖中的查詢使用的是在 c#語法而不是在新的語言。linq並不是一種新的語言。它被整合到 c# 和 vb.net。 此外,linq 可以用於避免.net 程式語言與 sql、 xsl 或其他特定於資料的語言想混淆。 linq 使查詢通過多種型別的資料儲存到程式語言的語言特定擴充套件集中。您可以把linq視為通用遠端控制。有時,您 會使用它來查詢資料庫 ;在其他方面,您也可以查詢 xml 文件。您只需使用您喜歡的程式語言不必切換到sql 或 xquery 等查詢語言。

在第 2 章我們將為您展示如何編寫已擴充套件到支援 linq 的詳情。

1.2 為什麼我們需要linq

我們只給您提供簡略講了linq。此時最大的問題是:為什麼我們希望使用 linq 之類的工具?為什麼不使用以前其它的工具呢?linq建立在程式語法裡,也同存在於關聯式資料庫和xml文件裡。

linq **於專案是乙個簡單的事實:在應用程式中用來驅動和與資料庫進行連線。因此應用程式中只懂一門c#語言是不能滿族需求的,你還要學習另一些語言,例如sql語法,配合連同 c# 以形成完整應用程式的 api。

我們將首先來看一段使用標準的.net api 的資料訪問**。我們會指出,在這種**中遇到的常見問題。然後,我們將通過顯示如何這些存在問題與其他型別的資料如 xml。你將看到linq 位址之間資料來源的一般不匹配和程式語言擴充套件我們的分析。最後,很少精短的**示例將向您展示 linq 是如何解決問題的。

1.2.1常見問題

應用程式中經常使用資料庫,要求.net framework 處理需要可以訪問儲存在該資料的 api。當然這是應用程式首要的任務之一。 .net framework 類庫 (fcl) 包括 ado.net 其中提供了乙個 api 訪問關聯式資料庫,並表現在記憶體中的關係資料。此 api 由類如 sqlconnection、 sqlcommand、 sqlreader、 dataset 和 datatable,組成。使用這些類的問題是他們強制開發人員能夠使用顯式表、 記錄和列等來表現,與現代語言如 c# 和 vb.net 使用中物件導向的模式不相符。

現在,物件導向的在軟體開發範例是使用模型,開發人員會導致大量的對映到其它的抽象特別關聯式資料庫和 xml 的開銷。結果是在編寫相關**是花費太多的時間。 linq 有助於我們提高工作效率。

但它不僅提高了生產力!它還會提高**質量。編寫乏味和脆弱模型類**可能會導致隱伏缺陷軟體或效能下降。

表 1.2 顯示如何我們通常會訪問.net 程式中的資料庫。通過發現存在的問題和與傳統**相比較,您將知道linq是非常優秀的。

表1.2.net資料庫類**

using (sqlconnection connection = new sqlconnection("..."))

connection.open();

sqlcommand command = connection.createcommand();

command.commandtext =

@"select name, country

from customers

where city = @city";//sql查詢語句

command.parameters.addwithvalue("@city", "paris");

using (sqldatareader reader = command.executereader())

while (reader.read())

string name = reader.getstring(0);//根據列獲得獲得相關引數

string country = reader.getstring(1);

只是開速瀏覽此**,我們就可以列出該模型的一些限制:

■雖然要執行簡單的任務但還是需要幾個步驟和詳細的**。

■查詢表示為帶引號的字串,這意味著他們繞過所有型別的編譯時檢查。如果該字串不包含有效的 sql 查詢? 如果已在資料庫中重新命名乙個列?就會出問題了。

■這同樣適用於引數,並設定為結果,但並不嚴禁。是否是預料的型別的列?而且,是我們確保我們使用正確數目的引數?是否引數的名稱,查詢和引數宣告之間一致?

■我們使用的類專用於 sql server,並且不能與另一台資料庫伺服器一起使用。當然,我們可以使用 dbconnection 及相關類來避免此問題,但這只會解決一半的問題。真正的問題是 sql 有許多特定於提供商的方言和資料型別。我們編寫不是一種型別的資料庫使用的語法、語言也不一樣。

存在其他的解決方案。我們可以使用**生成器或可用的種幾個的 物件對映工具之一。問題是這些工具不完善,完美的工具基本沒有。為例如果它們旨在用於訪問資料庫,大多數情況下他們不能處理其他資料來源如 xml 文件。

重構 一書要點

很實用的要點,每次重構都要重新看看這些要點,真正用到平時的日常工作中。壞味道 1.duplicate code 重複 2.long method 長方法 3.large class 過大的類 4.long parameter list 過長引數列 5.divergent change 發散式變化 6...

一書合,萬書開

一書合,萬書開。這句話雖然說的有點誇張,但是是不折不扣的現實。有時候一本好書合上了,就會發現更多的知識需要我們去學習,有更多的書需要去讀。浪潮之巔 讓我對自身所處的行業有了新的認識,對自己的道路多了很多疑問。如何走,怎麼走?未來的發展在 作為乙個從程式設計師 拔 上來的專案經理,過去的六個月讓我懂得...

每週一書計畫

雖然現在網際網路上的知識足夠豐富,雖然搜尋引擎足夠強大,雖然我們大部分時間都被碎片化,但是在這個煩亂 急躁的世界裡如果能靜下心來讀一本書將是多麼幸福的事情啊。書籍誕生上千年,伴隨著人類的進步發展到今天 在我們離開校園走入社會之前,我們一直在圍繞著書打轉。書就在我們的基因裡,書根深於我們的思想中,我們...