C# 3.0入门系列(三)
從本節開始,筆者將會和大家一起開始體驗dlinq了。前面我們準備了數據庫,也對數據庫之間的關系做了初步的了解。有了數據庫之后,數據和對象是一個什么樣的關系呢?從dlinq的設計來看,它主要是為了解決data!=objects 的問題而產生的。那么,現在,有了dlinq后數據和對象之間就可以有一個一一對應的關系了。我們既可以根據數據庫生成這種影射的代碼,也可以根據影射代碼生成數據庫。簡單的說,數據庫和影射代碼實現了相互轉化。linq preview提供了一個很好的工具,可以幫我們實現從數據庫到代碼的影射。它就是sqlmetal。beta2的sqlmetal在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin目錄下,或C:\WINDOWS\Microsoft.NET\Framework\v3.5目錄
打開cmd,運行sqlmetal程序。會出現下面的提示。
運行如下的命令。? sqlmetal /server:myserver /database:northwind /namespace:nwind /code:nwind.cs
/language:csharp
你可以根據northwind數據庫生成一個nwind.cs文件。你會在 linq priview的bin目錄發現它^_^ 。這里的參數的含義也非常的明確,筆者也不在多贅述。
在這里,我想和大家簡要介紹下這個影射文件nwind.cs.因為這個是程序自動生成的,我們暫時最好不要改,在后面的進階中,我將為大家詳細闡述此文件中code的含義,以及實現inheritance.
我們先來看Northwind 類的定義。
??? public partial class Northwind : DataContext {....
首先partial關鍵詞是C#2.0中出現的,本文不是講解C#2.0的,相關知識請參閱相關文獻。Northwind 的名字是根據你數據庫的名字定義的.我們發現,它必須從DataContext 類繼承,才可以獲得dlinq的支持。再往下看
??????? public Table<Order> Orders;
??????? public Table<Product> Products;
??????? public Table<OrderDetail> OrderDetails;
Table類是dlinq中定義的,這里他用了一個范性的概念,類似于C++中的模板。但C#和C++還是有區別,C++的泛型模板類似替換,只是編譯時用實際類型進行替換,因此對任何類型都可以,但是C#的泛型是在虛擬機級別上的實現,因此在編譯時會進行類型檢查(引)。Order, Product和OrderDetail等,都是sqlmetal程序根據數據庫里對應的表,自動產生的類。也就是class和table是一一對應的。而這樣也恰恰實現了object和data的對等。讓我們去看看Order的定義吧。我這里只貼出部分。??只簡單介紹幾個點,更加詳細內容我會在進介階段解釋,包括inheritance。?
????public?partial?class?Order?:?System.Data.DLinq.INotifyPropertyChanging,?System.ComponentModel.INotifyPropertyChanged?
{
????????private?int?_OrderID;
????????private?string?_CustomerID;
????????private?System.Nullable<int>?_EmployeeID;
…………
????????public?Order()?{
????????????this._OrderID?=?default(int);
????????????this._OrderDetails?=?new?EntitySet<OrderDetail>(new?Notification<OrderDetail>(this.attach_OrderDetails),?new?Notification<OrderDetail>(this.detach_OrderDetails));
????????????this._Customer?=?default(EntityRef<Customer>);
????????????this._Employee?=?default(EntityRef<Employee>);
????????????this._Shipper?=?default(EntityRef<Shipper>);
????????}
????????[Column(Storage?=?"_OrderID",?DBType?=?"Int?NOT?NULL?IDENTITY",?IsPrimaryKey?=?true,?IsDBGenerated?=?true)]
????????public?int?OrderID?{
????????????get?{
????????????????return?this._OrderID;
????????????}
????????}
}
因為影射文件是自動產生的,并不需要我們自己去手動制造,節約了我們大量勞動力。在這里,我們可以看到Order 類必須從兩個接口繼承,而且還要去實現接口里定義的方法。它還定義了一些私有的變量,這些似乎和數據表里字段沒有關系。其實,它在Property里描述著呢。dlinq會為每個數據表的字段定義一個對應Property,然后,會在其上加上attribute,如
[Column(Storage = "_OrderID", DBType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true)]
用來描述該Property對應數據表那個字段(Storage ),是什么類型(DBType ),是否主鍵(IsPrimaryKey ),是否自動增(IsDBGenerated )等。在這里,我們暫時先不要對這個文件進行修改,等你對它比較熟悉了之后,你就可以用它自己定義繼承,比如product下面還有好多種product呢。我將會在進介中介紹。
有了影射文件后,你是不是躍躍欲試,急于想創建一個自己的linq project了呢?在你安裝了linq preview后,選擇
file->new->Project. 你會發現比平時多了個選項。如圖所示。
選擇linq preview后,選擇一個linq console application,添上名字,讓我們立馬開始linq之旅吧。創建好工程后,將你自己前面產生nwind.cs文件加入到工程中,在program.cs中的鍵入如下代碼。
using?System;
using?System.Collections.Generic;
using?System.Text;
using?System.Query;
using?System.Xml.XLinq;
using?System.Data.DLinq;
using?System.Data;
using?System.Data.SqlClient;
using?nwind;
class?Program
{
????static?void?Main(string[]?args)
????{
????????Northwind?db?=?new?Northwind("Your?Connection?String");
????????var?q?=?from?c?in?db.Customers
?????????????????select?c;
????????foreach?(var?c?in?q)
????????{
????????????Console.WriteLine(c.ContactName);
????????}
????}
}
運行,哈哈,你的第一個linq preview的工程跑起來了,開心伐。呵呵,好從下章開始,筆者將著重給大家講解dlinq的語法。從下章開始,本系列將更名為入門系列,呵呵,本來就沒有書可讀嗎。同時將發布在首頁精華區,關注dlinq的朋友注意接收哦。
轉載于:https://www.cnblogs.com/126/archive/2006/09/06/492332.html
總結
以上是生活随笔為你收集整理的C# 3.0入门系列(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用IntelliJ IDEA 配置安卓(
- 下一篇: 以VMware workstation1