[C#3.0體驗]Orcas中內建的LinQ,XLinQ[DLinQ]擴充方法

來源:互聯網
上載者:User

 

  誰都知道LinQ是隨Orcas(VisualStudio2007)的.NET發布的內建的一個擴充方法,其實整個命名空間都是一個擴充方法的庫,它允許開發人員對任何資料類型進行查詢。大家都認為這是資料查詢的趨勢,也許以後的SQL語言會慢慢的發展,但我想現如今大家最想看到的是LinQ帶給我們的溫暖和快樂。微軟把這些擴充的方法放在System.Linq命名空間下,當我們建立一個新類型時,你會發現預設的命名空間中多了一個,在.NET2.0及以前的版本中都只有三個命名空間,現在多了個System.Linq。LinQ定義了標準的查詢操作符擴充方法,可以為.NET開發人員用來輕鬆地查詢XML,關聯式資料庫,.NET 對象,和任何其他資料結構類型。Let’s go,下面讓我們慢慢體會LinQ帶給我們的快樂吧!(版本VSMar07CTP)

  下面我們來看看LinQ分別對不同類型的資料進行查詢,但由於VSMar07CTP有一個BUG,我們再看下面的例子時首先要去掉這個BUG。在我查看M$Connect時發現已經有人提交了這個BUG,就是web.config中編譯通不過,其實去掉那個很簡單,我們開啟web.config找到<compiler>節點,把子節點注釋掉,OK去掉了BUG後我們就可以正常的編譯調試了,如下:

1     <system.codedom>
2         <compilers>
3             <compiler language="c#;cs;csharp" extension=".cs"
 type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0,
 Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
4         
5                 <!--<providerOption name="CompilerVersion" value="v3.5"/>
6             </compiler>-->
7         </compilers>
8     </system.codedom>

 

 

  由於時間和我寫作的底限不長,所以我們先看看對.NET的對象和XML使用LinQ的擴充方法,至於資料庫讓我們在下一次中慢慢體會。我們首先建立一個類,由於能夠給出更直觀得效果我直接把圖給剪輯過來。但是對於在部落格上發表可不是一件很好的做法,代碼如下:

  在這裡.NET3.0中類的簡化就不多說了,我們可以不必寫隱藏變數了,像上面就可以定義一個實體類了。我們可以用.NET 3.0新的類初始化器和集合初始化器對其進行初始化,代碼如下:

  初始化時會給我們很爽的智能提示,所以寫代碼比DotNet2.0真的會少很多。

   然後我可以使用由System.Linq提供的標準的“Where()”擴充方法來擷取這個集合中年齡為24的那些“Person”對象,代碼如下:


  LinQ擴充了很多方法,在智能提示中就可以看到,此代碼運行後返回:

Name:小兵; NickName:網魂小兵;
Name:小宋; NickName:Sek;
Name:小孫; NickName:隨風隨雲;

 下面是智能提示的介面:

 


  我們還可以體會很多新鮮的功能,但是在這裡就不再顯示其他的例子,下面我們來看看LinQ擴充方法在XML中的應用。其實我們也可以把它們應用於資料庫等資料檢索,我們首先來定義一個XML檔案,代碼如下:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <people>
 3   <person userID="1">
 4     <name>小兵</name>
 5     <nickName>網魂小兵</nickName>
 6     <age>24</age>
 7   </person>
 8   <person userID="2">
 9     <name>小賴</name>
10     <nickName>QQing</nickName>
11     <age>23</age>
12   </person>
13 </people>
14 

  對於XML的資料檢索有多種方法,在這裡我們看看怎樣用LinQ來檢索資料,要用到這個功能當然要引入命名空間System.Xml.Linq(這也就是傳說中的XLinQ,順便提一下對於資料庫的為DLinQ位於System.Data.Linq命名空間下)。[註:如果你找不到這兩個空間可以到%Windows%\Microsoft.Net\Framework目錄下的3.5裡直接引用DLL類庫。]

 

1 XDocument people = XDocument.Load(Server.MapPath("People.xml"));
2 IEnumerable<XElement> person = people.Descendants("person")
3                 .Where(p => p. Attribute ("userID").Value == "1");

  以上代碼它返回一個“XElement”元素序列,XElemen是沒有類型的XML節點元素。我們可以通過LINQ的 Select() 擴充方法來構造資料形狀,提供一個使用了新的對象初始化器句法的Lambda 運算式來填充同樣的“Person”類:

 1 XDocument people = XDocument.Load(Server.MapPath("People.xml"));
 2 
 3             IEnumerable<Person> person = people.Descendants("person")
 4                 .Where(p => p.Attribute("userID").Value == "1")
 5                 .Select(p => new Person { UserID=Convert.ToInt32(p.Attribute("userID").Value),
 6                                           Name=p.Element("name").Value,
 7                                   NickName=p.Element("nickName").Value,
 8                                  Age=Convert.ToInt32(p.Element("age").Value)
 9                                         });
10 

  由於我也是個初學者,今天的體驗就到此了,最後總要發表一下我的總體感受,LinQ帶給我們的功能其實是沒得說的,LinQ的強大允許一個可用於所有資料類型(資料庫,XML檔案,記憶體中的對象,以及web-services等)的共同的查詢編程模型和文法;LinQ是可以組合的,允許開發人員輕鬆地往查詢文法中添加新的方法/操作符,我們可以把我們自己擴充的方法應用其中;LinQ是可擴充的,允許與任何資料提供器類型一起使用,可以和現有的ORM引擎結合……但我覺得擴充方法在智能提示時會讓我覺得很亂,當你不要用LinQ時為了讓智能提示更清晰還是建議你去除System.Linq命名空間。其他的功能及效果等到後面繼續,也就是說欲知後事如何且聽下回分解!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.