System.Linq命名空間淺析
Linq有很多值得學習的地方,這里我們主要介紹System.Linq命名空間,包括介紹用LinQ來檢索數據等方面。
誰都知道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后我們就可以正常的編譯調試了,如下:
- <system.codedom>
- <compilers>
- <compiler language="c#;cs;csharp" extension=".cs"
- type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0,
- Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
- <!--<providerOption name="CompilerVersion" value="v3.5"/>
- </compiler>-->
- </compilers>
- </system.codedom>
我們還可以體會很多新鮮的功能,但是在這里就不再顯示其他的例子,下面我們來看看LinQ擴展方法在XML中的應用。其實我們也可以把它們應用于數據庫等數據檢索,我們首先來定義一個XML文件,代碼如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <people>
- <person userID="1">
- <name>小兵</name>
- <nickName>網魂小兵</nickName>
- <age>24</age>
- </person>
- <person userID="2">
- <name>小賴</name>
- <nickName>QQing</nickName>
- <age>23</age>
- </person>
- </people>
對于XML的數據檢索有多種方法,在這里我們看看怎樣用LinQ來檢索數據,要用到這個功能當然要引入命名空間System.Xml.Linq(這也就是傳說中的XLinQ,順便提一下對于數據庫的為DLinQ位于System.Data.Linq命名空間下)。[注:如果你找不到這兩個空間可以到%Windows%\Microsoft.Net\Framework目錄下的3.5里直接引用DLL類庫。]
- XDocument people = XDocument.Load(Server.MapPath("People.xml"));
- IEnumerable<XElement> person = people.Descendants("person")
- .Where(p => p. Attribute ("userID").Value == "1");
以上代碼它返回一個“XElement”元素序列,XElemen是沒有類型的XML節點元素。我們可以通過LINQ的 Select() 擴展方法來構造數據形狀,提供一個使用了新的對象初始化器句法的Lambda 表達式來填充同樣的“Person”類:
- XDocument people = XDocument.Load(Server.MapPath("People.xml"));
- IEnumerable<Person> person = people.Descendants("person")
- .Where(p => p.Attribute("userID").Value == "1")
- .Select(p => new Person { UserID=Convert.ToInt32(p.Attribute("userID").Value),
- Name=p.Element("name").Value,
- NickName=p.Element("nickName").Value,
- Age=Convert.ToInt32(p.Element("age").Value)
- }
- }
由于我也是個初學者,今天的體驗就到此了,***總要發表一下我的總體感受,LinQ帶給我們的功能其實是沒得說的,LinQ的強大允許一個可用于所有數據類型(數據庫,XML文件,內存中的對象,以及web-services等)的共同的查詢編程模型和語法;LinQ是可以組合的,允許開發人員輕松地往查詢語法中添加新的方法/操作符,我們可以把我們自己擴展的方法應用其中;LinQ是可擴展的,允許與任何數據提供器類型一起使用,可以和現有的ORM引擎結合……但我覺得擴展方法在智能提示時會讓我覺得很亂,當你不要用LinQ時為了讓智能提示更清晰還是建議你去除System.Linq命名空間。其他的功能及效果等到后面繼續,也就是說欲知后事如何且聽下回分解!
【編輯推薦】