LINQ匿名類型分析
在向大家詳細(xì)介紹LINQ匿名類型之前,首先讓大家了解下LINQ查詢輸出的基本例子,然后全面介紹LINQ匿名類型。
本文介紹使用LINQ匿名類型來自定義LINQ查詢輸出的基本例子。下面的示例提供了一個更復(fù)雜和更實際的場景。它把我們的城市列表轉(zhuǎn)換成一個分層的結(jié)果集合──我們將使用一個LINQ匿名類型來對結(jié)果按國家分組,這個LINQ匿名類型包含了一個國家名稱,一個城 市詳細(xì)信息的子集合和在這個國家中所有城市距離的總和,這距離之和將通過第五步中示范過的lambda表達(dá)式 來計算:
- using System;
- using System.Web.UI;
- using System.Query;
- public partial class Step7 : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- TravelOrganizer travel = new TravelOrganizer();
- GridView1.DataSource = from location in travel.PlacesVisited
- & nbsp; group location by location.Country into loc
- & nbsp; select new {
- & nbsp; & nbsp; Country = loc.Key,
- & nbsp; & nbsp; Cities = loc,
- & nbsp; & nbsp; TotalDistance = loc.Sum(dist => dist.Distance)
- & nbsp; };
- GridView1.DataBind();
- }
- }
我們.aspx頁面中的GridView是這樣定義的:
- <%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Step7.aspx.cs" Inherits="Step7" %>- <html>
- <body>
- <form id="form1" runat="server">
- <div>
- <h1>Groupings with Anonymous Classes</h1>
- <asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">
- <Columns>
- <asp:BoundField HeaderText="Country" DataField="Country" />
- <asp:TemplateField HeaderText="Cities">
- & nbsp;<ItemTemplate>
- & nbsp;
- & nbsp;<asp:BulletedList ID="BulletedList1" runat="server"
- & nbsp; & nbsp;DataSource='<%#Eval("Cities")%>' DataValueField="City"/>
- & nbsp;
- & nbsp;</ItemTemplate>
- </asp:TemplateField>
- <asp:BoundField HeaderText="Total Distance" DataField="TotalDistance" />
- </Columns>
- </asp:GridView>
- </div>
- </form>
- </body>
- </html>
注意,我在GridView的模版列中添加了一個"Cities"列,并且在其中添加了一個<asp:bulletedlist>控件 (一個新的ASP.NET 2.0自帶控件)來綁定在上面用LINQ查詢所得到的分層結(jié)果。
注意,所有上面的綁定語法和層次綁定在現(xiàn)在的ASP.NET 2.0中是完全支持的,所以,你可以在現(xiàn)有的程序中使 用這些技術(shù)。新穎(我也認(rèn)為非常酷)之處,是LINQ匿名類型和LINQ提供的數(shù)據(jù)構(gòu)形功能,這個功能使得在ASP.NET 控件里綁定分層數(shù)據(jù)非常容易。
上面所有的例子操作的都是本地內(nèi)存中的集合數(shù)據(jù)。他們展示了你如何在.NET對象模型中使用LINQ,包括那些你 自己創(chuàng)建的類型。
在我將來的有關(guān)LINQ的文章中,我將深入討論LINQ,利用新的DLINQ支持使用上面提到的技術(shù)來處理關(guān)系數(shù)據(jù)庫 ,和通過新的XLINQ支持來處理XML文件和結(jié)構(gòu)。LINQ項目的好處在于,在所有的應(yīng)用中,其句法和概念都是一 樣的,這樣,你一旦學(xué)會使用LINQ對一個數(shù)組或集合做查詢,你也就知道了在處理數(shù)據(jù)庫甚至XML文件時所需 的所有概念。
例如,假如你使用DLINQ生成了Northwinds數(shù)據(jù)庫中供應(yīng)商(Suppliers)和產(chǎn)品( Products)表相對應(yīng)的.NET類型(注:你不需要編寫任何代碼就可以實現(xiàn)),那么要獲取分層的數(shù)據(jù)結(jié)果,并且將其綁定到GridView上,你只要寫下面這個編碼就可以了(注意:我們使用了跟前面的例子一樣的數(shù)據(jù)構(gòu)形技術(shù),只從數(shù)據(jù)庫中取得兩列數(shù)據(jù),并且自動地把每個供應(yīng)商和其對應(yīng)的產(chǎn)品組合成一個層次結(jié)構(gòu)的結(jié) 果):
- using System;
- using System.Query;
- public partial class Data_Data2 : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- Northwind db = new Northwind();
- GridView1.DataSource = from x in db.Suppliers
- & nbsp; where x.Country == "USA"
- & nbsp; orderby x.Country
- & nbsp; select new {
- & nbsp; & nbsp;x.CompanyName,
- & nbsp; & nbsp;x.Country,
- & nbsp; & nbsp;x.Products
- & nbsp;};
- GridView1.DataBind();
- }
- }
不需要額外的SQL語句和代碼──這些就是實現(xiàn)高效獲取和組裝層次數(shù)據(jù)所需的所有代碼(注意:只取出了需要的 列和行的數(shù)據(jù)-DLINQ可以使用LINQ的遠(yuǎn)程函數(shù)支持因而我們沒必要持久化或者取出所有數(shù)據(jù)庫表或者一行中 的所有列)。而且這些都是類型安全的,同樣具有完全的編譯時檢查,智能感知和調(diào)試支 持。
更棒的是,接入一個新的LINQ提供器(DLINQ和XLINQ是兩例)的機制是完全公開的──因此那些已經(jīng)建立或者使用現(xiàn) 有數(shù)據(jù)提供程序(例如:O/R數(shù)據(jù)庫映射)的開發(fā)人員可以很容易的無縫地把他們的實現(xiàn)和LINQ整合起來。一 旦你了解了LINQ,你就知道了開發(fā)LINQ所需的所有的基本知識。
【編輯推薦】