C# 3.0 LinQ入門系列_第1頁
C# 3.0 LinQ入門系列_第2頁
C# 3.0 LinQ入門系列_第3頁
C# 3.0 LinQ入門系列_第4頁
C# 3.0 LinQ入門系列_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、C# 3.0 LinQ入門系列目錄導(dǎo)航1 C# 3.0 入門系列(一)從linq開始引C# 3.0。2 C# 3.0入門系列(二)數(shù)據(jù)庫的準備,引入Linq To Sql的準備。3 C# 3.0入門系列(三) 第一個Linq To Sql工程。4 C# 3.0入門系列(四)-之Select操作 Select語法。5 C#3.0入門系列(五)-之Where操作 Where操作語法。6 C#3.0入門系列(六)-之OrderBy操作 OrderBy 操作語法。7 C#3.0入門系列(七)-之OR工具介紹 映射工具的介紹,OR Designer8 C#3.0入門系列(八)-之GroupBy操作 Gr

2、oupBy 操作入門。9 C#3.0入門系列(九)-之GroupBy操作 更多GroupBy操作。10 C#3.0入門系列(十)-之Join操作 Join操作11 C#3.0入門系列(十一)-之In, Like操作 In & Like操作12 C#3.0入門系列(十二)-Lambda表達式中LiftingLambda表達式中的Lifting目錄C# 3.0 入門系列(一)2C# 3.0入門系列(二)4C# 3.0入門系列(三)7C# 3.0入門系列(四)-之Select操作12C#3.0入門系列(五)-之Where操作16C#3.0入門系列(六)-之OrderBy操作20C#3.0入門

3、系列(七)-之OR工具介紹24C#3.0入門系列(八)-之GroupBy操作30C#3.0入門系列(九)-之GroupBy操作34C#3.0入門系列(十)-之Join操作40C#3.0入門系列(十一)-之In, Like操作48C#3.0入門系列(十二)-Lambda表達式中Lifting53C# 3.0 入門系列(一) 談到dlinq,就不得不先說linq。讓我們先看看什么是linq。linq是 Language Integrated Query的縮寫。那么事實上dlinq就是 Database Language Integrated Query 的縮寫。lin

4、q和dlinq最大的區(qū)別就在與linq是對內(nèi)存進行操作,而dlinq的操作對象為數(shù)據(jù)庫。我們先來看一個linq的例子。在這之前,你需要安裝s2008beta版本。可以到  下載。如果,你的機器上是vs2005的英文版,你還需要安裝一個linq preview版本。你可以到下面地址去下載。微軟也提供了好多學(xué)習(xí)的地方。先給出幾個鏈結(jié)。好,我們先來看一個linq的例子。這個例子可以從linq的說明文檔上得到。the linq sample 1using System; 2using System.Query; 3using Sys

5、tem.Collections.Generic; 4 5class app  6  static void Main()  7    string names =  "Burke", "Connor", "Frank",  8       

6、                "Everett", "Albert", "George",  9                    &

7、#160;  "Harris", "David" 1011    IEnumerable<string> expr = from s in names 12                    &

8、#160;          where s.Length = 513                               orderby s

9、14                               select s.ToUpper();1516    foreach (string item in expr)17 

10、60;    Console.WriteLine(item);18  1920你可能感覺比較陌生。放心,這大概是第一次看到緣故。在這里像 from ,where,orderby, select等都是linq的保留字,都該用藍色顯示的,但是好像cnblogs還沒有開始支持。所以插入代碼時,他們就被當(dāng)作普通字符了。其實,query expression看起來和sql語句很像。 比如 select * from table1 where column1 = ""我第一次看到linq時,就感覺是寫在程序里的sql

11、語句。只不過,以前我們都是用string類型形成一個sql語句,然后通過command或adapter傳到sql server中。而現(xiàn)在,感覺就像把sql語句直接當(dāng)成程序代碼來實現(xiàn)。這只不過是我們的一個錯覺。這個例子,只不過是從一個string的數(shù)組中,提取出長度為5的,并且把提取的數(shù)據(jù)全部變成大寫。IEnumerable<string> 使用到了c#2.0中的泛型。 該列子的結(jié)果,返回一個數(shù)據(jù)集,存放到expr中。 在這里,從那個數(shù)據(jù)集中取的結(jié)果,是用in 表達的,如列所示,from s in names , 在names集合中,取出s。s代表一條條紀錄。where 表示條件,o

12、rderby 表示按什么排序。select 選擇那些字段組成變量。這里,你可能會覺得奇怪,s變量在那里聲明的呢。我第一看到這里的時候,也感到奇怪。其實s變量是names變量里的元素,你在in names 時,已經(jīng)聲明了s變量。在這個列子中,大家可以先感受一下linq,在隨后的章節(jié)中,我會為大家介紹更多。對內(nèi)存數(shù)組的查詢,并不能顯示出linq的強大功能,對數(shù)據(jù)庫的操作,才使得linq更加具有實際意義。在隨后的章節(jié)中,我將逐漸介紹dlinq的語法。 C# 3.0入門系列(二) 在第一篇中,我已經(jīng)和大家簡單介紹了linq。也和大家提起linq是C# 3.0里的一個特性。不過,你去裝linq priv

13、iew時,你會發(fā)現(xiàn),它提供了許多vb的linq代碼。從現(xiàn)在的情況看,linq會被移植到.net framework下。在本篇中,筆者將開始更加詳細的介紹dlinq。同時,也會介紹很實用的技巧和方法。在這之前,你需要安裝s2008beta版本。可以到  下載。如果,你的機器上是vs2005的英文版,你還需要安裝一個linq preview版本。你可以到下面地址去下載。以后的章節(jié)中,筆者將會配合這個版本,進行講解,并對它里面提供的例子進行詳細的說明。安裝linq preview后,你可以在安裝目錄下,找到安裝程序提供的例子。C# 的應(yīng)該在C:Program FilesLINQ Previ

14、ewC#SamplesSampleQueries目錄下。打開該工程。因為dlinq主要是對數(shù)據(jù)庫進行操作,你還需要準備數(shù)據(jù)庫。例程給你提供的數(shù)據(jù)庫是用.SQLEXPRESS來實現(xiàn)的。說實話,這個版本的數(shù)據(jù)庫實在是難用。我建議大家使用SQL2000 or SQL2005. 你可以在C:Program FilesLINQ PreviewData目錄下找到一個叫做NORTHWND的數(shù)據(jù)庫文件。如圖所示,把它附加到你的服務(wù)器上。因為NORTHWND是SQL SERVER附帶的例子數(shù)據(jù)庫,你可能需要將原來的刪掉,才能附加新的上去。你也可以到 下載for beta2的sample。其數(shù)據(jù)文件的路徑為,Li

15、nqSamplesSampleQueriesData你在附加這個數(shù)據(jù)庫的時候,有可能碰到SQL2000 附加不上去的問題。你可以給我留言,我這里有SQL2000 的數(shù)據(jù)庫備份。在附加完數(shù)據(jù)庫后,你需要修改程序文件了,讓SampleQueries的程序使用你剛附加的數(shù)據(jù)庫。打開SampleQueries的程序,在Solution Explorer中找到DLinqSamples.cs文件,打開它,找到24行。如下的代碼。private readonly static string connString = "AttachDBFi

16、leName='" + dbPath + "'Server='" + sqlServerInstance + "'Integrated Security=SSPI;enlist=false"將它替換為 private readonly static string connString = "Server=yourSever;Database=northwi

17、nd;User=yourname;Password=yourPassword"這樣,你就可以使用你剛附加的數(shù)據(jù)庫了?;蛟S你要問為什么非要用這個新的數(shù)據(jù)庫,為什么不用SQL SERVER附帶,那是因為在這個新的數(shù)據(jù)庫中,我們添加了許多新的東西。_一切都準備好以后,我們就可以來看這個例子了。筆者在這么沒有興趣講解SampleQueries是如何設(shè)計的,也沒有興趣講解它是如何取到code的。這里我們只講dlinq。先讓我們來看看大體的一個界面。界面做的很漂亮也很簡潔。選擇左邊目錄樹,第一個主接點是linq的101例子,前面我也和大家講過來linq的主要是針對內(nèi)存操作。dlinq才是針對數(shù)據(jù)

18、庫操作。我們的重點依然在dlinq上。如圖所示,選擇where接點中第一個,然后右邊代碼區(qū)會顯示該段代碼,點run sample!,下面會首先出現(xiàn)程序翻譯的sql語句,再下面是返回的數(shù)據(jù)集。在正式講解dlinq的語法前,筆者也許還要把northwind數(shù)據(jù)庫中的表以及表之間的關(guān)系簡單地和大家交代下。 幾個表的關(guān)系如上圖。我們常用的幾個要說明下。一個是Customers表為客戶表,一個是Orders表為訂單表,一個是Products表為產(chǎn)品表,最后一個是Order Details表,為訂單詳細表。因為northwind是大家已經(jīng)很熟悉的一個數(shù)據(jù)庫,我就不再做贅言。 下章,我將依然為大家準備最關(guān)鍵

19、的一個環(huán)節(jié),影射文件。C# 3.0入門系列(三) 從本節(jié)開始,筆者將會和大家一起開始體驗dlinq了。前面我們準備了數(shù)據(jù)庫,也對數(shù)據(jù)庫之間的關(guān)系做了初步的了解。有了數(shù)據(jù)庫之后,數(shù)據(jù)和對象是一個什么樣的關(guān)系呢?從dlinq的設(shè)計來看,它主要是為了解決data!=objects 的問題而產(chǎn)生的。那么,現(xiàn)在,有了dlinq后數(shù)據(jù)和對象之間就可以有一個一一對應(yīng)的關(guān)系了。我們既可以根據(jù)數(shù)據(jù)庫生成這種影射的代碼,也可以根據(jù)影射代碼生成數(shù)據(jù)庫。簡單的說,數(shù)據(jù)庫和影射代碼實現(xiàn)了相互轉(zhuǎn)化。linq preview提供了一個很好的工具,可以幫我們實現(xiàn)從數(shù)據(jù)庫到代碼的影射。它就是sqlmetal。beta2的sql

20、metal在C:Program FilesMicrosoft SDKsWindowsv6.0Abin目錄下,或C:WINDOWSMicrosoft.NETFrameworkv3.5目錄打開cmd,運行sqlmetal程序。會出現(xiàn)下面的提示。運行如下的命令。  sqlmetal /server:myserver /database:northwind /namespace:nwind /code:nwind.cs/language:csharp你可以根據(jù)northwind數(shù)據(jù)庫生成一個nwind.cs文件。你會在 linq priview的bin目錄發(fā)現(xiàn)它_ 。這里的參數(shù)的含義也非常的

21、明確,筆者也不在多贅述。在這里,我想和大家簡要介紹下這個影射文件nwind.cs因為這個是程序自動生成的,我們暫時最好不要改,在后面的進階中,我將為大家詳細闡述此文件中code的含義,以及實現(xiàn)inheritance我們先來看Northwind 類的定義。    public partial class Northwind : DataContext 首先partial關(guān)鍵詞是C.中出現(xiàn)的,本文不是講解C.的,相關(guān)知識請參閱相關(guān)文獻。Northwind 的名字是根據(jù)你數(shù)據(jù)庫的名字定義的我們發(fā)現(xiàn),它必須從DataContext 類繼承,才可以獲得dlinq的支持。再往

22、下看        public Table<Order> Orders;        public Table<Product> Products;        public Table<OrderDetail> OrderDetails;Table類是dlinq中定義的,這里他用了一個范性的概念,類似于C+中的模板。但C#和C+還是有區(qū)別,C+

23、的泛型模板類似替換,只是編譯時用實際類型進行替換,因此對任何類型都可以,但是C#的泛型是在虛擬機級別上的實現(xiàn),因此在編譯時會進行類型檢查(引)。Order, Product和OrderDetail等,都是sqlmetal程序根據(jù)數(shù)據(jù)庫里對應(yīng)的表,自動產(chǎn)生的類。也就是class和table是一一對應(yīng)的。而這樣也恰恰實現(xiàn)了object和data的對等。讓我們?nèi)タ纯碠rder的定義吧。我這里只貼出部分。  只簡單介紹幾個點,更加詳細內(nèi)容我會在進介階段解釋,包括inheritance。  Table(Name = "Orders")

24、    public partial class Order : System.Data.DLinq.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged         private int _OrderID;       

25、60;private string _CustomerID;        private System.Nullable<int> _EmployeeID;        public Order()             this._Orde

26、rID = default(int);            this._OrderDetails = new EntitySet<OrderDetail>(new Notification<OrderDetail>(this.attach_OrderDetails), new Notification<OrderDetail>(this.detach_Orde

27、rDetails);            this._Customer = default(EntityRef<Customer>);            this._Employee = default(EntityRef<Employee>);   

28、0;        this._Shipper = default(EntityRef<Shipper>);                Column(Storage = "_OrderID", DBType = "Int NOT

29、60;NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true)        public int OrderID             get       

30、          return this._OrderID;                    因為影射文件是自動產(chǎn)生的,并不需要我們自己去手動制造,節(jié)約了我們大量勞動力。在這里,我們可以看到Order 類必須從兩個接口繼承,而且還要去實現(xiàn)接口里定義的方法。它還定義了一些私有的變量,

31、這些似乎和數(shù)據(jù)表里字段沒有關(guān)系。其實,它在Property里描述著呢。dlinq會為每個數(shù)據(jù)表的字段定義一個對應(yīng)Property,然后,會在其上加上attribute,如Column(Storage = "_OrderID", DBType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true)用來描述該Property對應(yīng)數(shù)據(jù)表那個字段(Storage ),是什么類型(DBType ),是否主鍵(IsPrimaryKey ),是否自動增(IsDBGenerated )等

32、。在這里,我們暫時先不要對這個文件進行修改,等你對它比較熟悉了之后,你就可以用它自己定義繼承,比如product下面還有好多種product呢。我將會在進介中介紹。有了影射文件后,你是不是躍躍欲試,急于想創(chuàng)建一個自己的linq project了呢?在你安裝了linq preview后,選擇file->new->Project. 你會發(fā)現(xiàn)比平時多了個選項。如圖所示。選擇linq preview后,選擇一個linq console application,添上名字,讓我們立馬開始linq之旅吧。創(chuàng)建好工程后,將你自己前面產(chǎn)生nwind.cs文件加入到工程中,在program.cs中的鍵

33、入如下代碼。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

34、60;Main(string args)            Northwind db = new Northwind("Your Connection String");        var q = from c in db.Customers

35、                 select c;        foreach (var c in q)                

36、    Console.WriteLine(c.ContactName);            運行,哈哈,你的第一個linq preview的工程跑起來了,開心伐。呵呵,好從下章開始,筆者將著重給大家講解dlinq的語法。從下章開始,本系列將更名為入門系列,呵呵,本來就沒有書可讀嗎。同時將發(fā)布在首頁精華區(qū),關(guān)注dlinq的朋友注意接收哦。C# 3.0入門系列(四)-之Select操作 先給關(guān)注dlinq的朋友們道歉,最近工作實在忙,

37、沒有時間來寫blog。從本節(jié)開始,我們講dlinq語法咯。我們先從select子句講起。看下面的例子。    var q =        from c in db.Customers        select c.ContactName;這是一個最簡單的dlinq查詢語句,查詢得到聯(lián)系人的名字。在這里,我需要提醒下大家的是,像這個語句

38、只是個聲明,dlinq并沒有真正把數(shù)據(jù)取出來,只有當(dāng)你需要該數(shù)據(jù)的時候,它才會幫你去取,這就是延遲加載(deferred loading)。如果,你想在聲明的時候就希望dlinq幫你取到數(shù)據(jù),你可以使用ToList() 或ToArray()方法。如上例。         var q = (from c in db.Customers          

39、60;      select c.ContactName).ToArray();或         var q = (from c in db.Customers                 select 

40、;c.ContactName).ToList();在這里,我還要提醒大家一點。dlinq返回的結(jié)果集是對象的集合,不是數(shù)據(jù)的。 在dlinq執(zhí)行的時候,它會先將上面的標準查詢轉(zhuǎn)換成dlinq的API(也有人叫級連方法),比如,下面語句             var q =              

41、0; from c in db.Customers                where c.City = "London"                select c;就

42、會先被轉(zhuǎn)化成 var q = db.Customers.Where(c=>c.City= "London").Select(c=>c); 也就是說,這兩個語句是等價的。而后,dlinq會解析影射文件,根據(jù)dlinq的query語句,自動產(chǎn)生sql語句,并把sql送到sql server服務(wù)器,根據(jù)返回的數(shù)據(jù)集,創(chuàng)建相應(yīng)的對象。在這里,你可能會對c=>c感到非常陌生。這是Lambda表達式(expression),你可以理解c為結(jié)果集里的任一對象,這對象的類型是和你結(jié)果集里元素類型是一致的 。這里理解起來可能困難。我們一起來理解下數(shù)據(jù)即是對象的概念

43、。我相信這會幫我們理解Lambda表達式。在dlinq之前,在java領(lǐng)域有Hibernate,在net領(lǐng)域有NHibernate技術(shù),來實現(xiàn)object/relational 持久和查詢服務(wù)。dlinq其實質(zhì)上,是在吸收了眾多技術(shù)的基礎(chǔ)上,比他們更加強大的工具。數(shù)據(jù)即對象的含義有兩層。第一,數(shù)據(jù)結(jié)構(gòu)(表結(jié)構(gòu))即是類??梢悦枋鰹門able Schema-Class。第二,表里的數(shù)據(jù)即是變量,描述為Data-object(variable)。那么,我們在來理解Lambda表達式可能就容易些。剛才我們已經(jīng)說了,var q = db.Customers.Where(c=>c.City= &qu

44、ot;London").Select(c=>c);將會返回Customers對象的集合,也就說,這個集合的每個元素就是一個Customer。Lambda表達式是對c# 2.0中的anonymous methods(匿名方法)的擴展。它更加簡化匿名方法的實現(xiàn)形式。這里的c是一種隱式的聲明,編譯器會自動推斷它的實際類型,也可以顯示聲明,比如,  var q = db.Customers.Where(Customer c) => c.City = "London").ToList();  Lambda表達式用=>符號跟隨一個表達式,

45、這個表達式,需要返回一個類型,其實質(zhì)就是一個方法返回一個類型。它只是更加簡潔的匿名方法。然后,where等操作符用它返回的這個類型做為參數(shù)。關(guān)于Lambda表達式的具體實現(xiàn),我會在進階部分詳細講解。這里不再贅述。有一點要提醒大家的是,標準的查詢語句,必須是select語句在最后,而級連表達式,各種操作符的位置并不是很重要。比如var q = db.Customers.Where(c=>c.City= "London").Select(c=>c); 可以寫成var q = db.Customers.Select(c=>c).Where(c=>c.Cit

46、y= "London");它們兩個是一樣的,但是,標準查詢就不可以換位子,select語句必須在最后。雖然在級連表達式,各種操作符的位置并不是很重要,但是他們還是有區(qū)別的。特別是在使用匿名類后,區(qū)別很明顯。但萬變不離其宗,我們只要記住,下一個操作符總是在上一個操作符所篩選的數(shù)據(jù)集的基礎(chǔ)上進行篩選。這點,我會在以后的blog中,更加詳細的說明。在select語句中,另一個難點是匿名類。比如列子             var q =

47、60;               from c in db.Customers                select new c.ContactName, c.Phone;其實不光在select操作中有匿名類,其他操作中也

48、有。讓我們一起來理解下匿名類。上面的語句與var q = db.Customers.Select(c=>new c,ContactName,c.Phone);是等價的。匿名類是c# 3.0中新出現(xiàn)的特性。其實質(zhì)是編譯器根據(jù)用戶定義,自動產(chǎn)生一個匿名的類,幫用戶實現(xiàn)臨時變量的儲存。注意,是臨時變量。大量使用匿名類會使程序可讀性降低。匿名類還依賴于另外一個特性,就是在c# 3.0可以支持根據(jù)property來創(chuàng)建對象。比如,有類     public class Person     

49、;       private string name;        public string Name                    get  return name

50、;             set  name = value;             以前,我們只可以用構(gòu)造函數(shù)來創(chuàng)建其對象,現(xiàn)在在3.0中支持用property來創(chuàng)建,即,可以用 var d = new Person Name = "s" ; 來創(chuàng)建對象。在這里,

51、你可能還對var類型產(chǎn)生疑問。你可能以為c#3.0和javascript一樣是弱類型的。其實var并不是c#3.0的類型,它是編譯器的關(guān)鍵字,編譯器根據(jù)實際變量的返回類型,自動推斷類型。那么var c = null; 是無法編譯通過,因為編譯不知道null代表那個類型。所以,c#3.0還是強類型的?,F(xiàn)在3.0可以支持用property來創(chuàng)建對象了,那么就有了匿名類的出現(xiàn)。比如,var d = new Name = "s" ;編譯器自動產(chǎn)生一個有property叫做Name的匿名類,然后按這個類型分配內(nèi)存,并初始化對象。在這個地方,還有個問題,比如,var d = new &

52、#160; "s" ;是編譯不通過的。因為,編譯器不知道匿名類中的property的名字。但是,如果,        string c = "d"     var d = new c; 則是可以通過編譯的。編譯器會創(chuàng)建一個叫做匿名類帶有叫c的property。 在dlinq中,比如new c,ContactName,c.Phone);這里出現(xiàn)ContactName和Phone都是我們在影射文件中定義的和表中字段相對應(yīng)的property。編譯器在取

53、會數(shù)據(jù)并創(chuàng)建對象時,會創(chuàng)建一個匿名類,這個類有兩個屬性,為ContactName和Phone,然后根據(jù)數(shù)據(jù)初始化對象。匿名類還有另外一種形式。             var q =                from e in db.Employees 

54、               select new Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone;這種形式和第一種不同的是,編譯器會重命名property的名字。當(dāng)然也可以把兩種形式組合起來。    

55、0;        var q =                from p in db.Products                selec

56、t new p.ProductID, HalfPrice = p.UnitPrice / 2;第一個屬性的名字不會變,第二個會被重新命名。好,就先講這幾個,下節(jié)我會介紹幾個更復(fù)雜的用法。 C#3.0入門系列(五)-之Where操作 從本節(jié)開始,本文正式更名為C#3.0入門系列。先發(fā)布一則消息,VS2007 Beta版本已經(jīng)發(fā)布咯,下載地址:大家快去下載呀,我也好和大家一起體驗該版本最新功能呀。dlinq也更名為linq to sql本文也跟著做相應(yīng)變化,稍候,我會去更新前面的文章。我們先接著講linq的語法。Select操作

57、最簡單的,            var q =                from c in db.Customers            &

58、#160;   select c.ContactName;匿名類的,            var q =                from c in db.Customers    

59、            select new c.ContactName, c.Phone;,            var q =               

60、; from e in db.Employees                select new Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone;,   &

61、#160;        var q =                from p in db.Products                se

62、lect new p.ProductID, HalfPrice = p.UnitPrice / 2;條件的            var q =                from p in db

63、.Products                select new p.ProductName, Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Out Of Stock": "In Sto

64、ck"這種條件的會被翻譯成sql中casewhenconditionthenelse的。nametype形式的:            var q =                from e in db.Employees   

65、;                             select new Name FirstName = e.FirstName, LastName = e.LastName;只所以是nametype的,是因為Name類

66、是已經(jīng)定義好的,也就是說,你可以用這種方式,返回你需要類型的對象集shaped形式的:             var q =                from c in db.Customers     

67、0;          select new                     c.CustomerID,              

68、      CompanyInfo = new c.CompanyName, c.City, c.Country,                    ContactInfo = new c.ContactName, c.ContactTitle&

69、#160;               該形式,其select操作使用了匿名對象,而這個匿名對象中,其屬性也是個匿名對象。nested形式的:            var q =           

70、;     from o in db.Orders                select new                    

71、0;o.OrderID,                    DiscountedProducts =                        

72、;from od in o.OrderDetails                        where od.Discount > 0.0            &#

73、160;           select od,                    FreeShippingDiscount = o.Freight         

74、;       其返回的對象集中的每個對象DiscountedProducts屬性中,又包含一個小的集合。也就是每個對象也是一個集合類。Distinct形式的:            var q = (               

75、; from c in db.Customers                select c.City )                .Distinct();該形式,篩選該字段中不相同的值。會被翻譯為select

76、 distinct city from customerswhere操作:最簡單的 ,            var q =                from c in db.Customers      

77、;          where c.City = "London"                select c;,            var 

78、;q =                from e in db.Employees                where e.HireDate >= new DateTime(1994,&

79、#160;1, 1)                select e;或與關(guān)系的where條件 ,            var q =            

80、    from p in db.Products                where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued        

81、60;       select p;,            var q =                from p in db.Products   &

82、#160;            where p.UnitPrice > 10m | p.Discontinued                select p;,       &#

83、160;    var q =                db.Products.Where(p=>p.UnitPrice > 10m).Where(p=>p.Discontinued);在上例中,和語句先被翻譯成類似語句的形式,再被翻譯成sql語句,送回數(shù)據(jù)服務(wù)器。他們基本上一樣的。欠套在first操作中的where條件:first操

84、作,其實質(zhì)就是在sql語句前,加了一個top,            Customer cust = db.Customers.First(c => c.CustomerID = "BONAP");            Order ord =

85、 db.Orders.First(o => o.Freight > 10.00M);第一個例子,是篩選customerid為"BONAP"的客戶,第二個篩選訂單運費大于10的訂單。First操作必須用這種級連的形式。比如 Shipper shipper = db.Shippers.First();也可以把linq的expression和級連的形式混合使用,比如第一個例子,加入first操作,        

86、0;    var q =                (from c in db.Customers                where c.City =

87、60;"London"                select c).First();如果加入first操作,其返回是一個具體的對象,而不是一個集合。如果first操作沒有條件,它只是簡單的在sql語句中添加top,如果有條件,它在翻譯時,就會加入條件語句。 C#3.0入門系列(六)-之OrderBy操作 本節(jié)講orderby操作我突然在想這么一個問題,讀者會T-SQL嗎?要是不知道,那我寫的是不是太簡

88、單了呢?做個調(diào)查哦,不知道的舉手OrderBy操作簡單的,按雇用日期排序,默認為升序             var q =                from e in db.Employees      

89、;          orderby e.HireDate                select e;帶where條件的,shipcity為london的。            var

90、0;q =                from o in db.Orders                where o.ShipCity = "London"  

91、              orderby o.Freight                select o;或            var q&

92、#160;=                from o in db.Orders                orderby o.Freight       

93、0;        where o.ShipCity = "London"                select o;在這里where和orderby的順序并不重要。而在T-SQL中,where和orderby有嚴格的位置限制。OrderByDescending的,按價格降序。 &#

94、160;          var q =                from p in db.Products              

95、60; orderby p.UnitPrice descending                select p;ThenBy的和ThenByDescending,也就是按多個列進行排序,第一個列子是先按city,city相同的再按contactname排序,第二個例子中,第二序列為降序。ThenBy:       

96、0;    var q =                from c in db.Customers                orderby c.City, c.

97、ContactName                select c;ThenByDescending:            var q =            &

98、#160;   from o in db.Orders                where o.EmployeeID = 1                orderby o

99、.ShipCountry, o.Freight descending                select o;對這兩個句子解釋下。對于ThenBy操作,其級連形式為:       var q = db.Customers.OrderBy(c => c.City).ThenBy

100、(c => c.ContactName).ToList();因為T-SQL中,并沒有ThenBy語句,其依然翻譯為OrderBy所以,也可以用下面語句來表達var q = db.Customers.OrderBy(c => c.ContactName).OrderBy(c => c.City).ToList();所要注意的是,是兩個orderby的順序,多個orderby操作時,級連方式是按逆序即先按city排時,city要放在最后。對于降序的,用相應(yīng)的降序操作符替換即刻。 &

101、#160;      var q = db.Customers.OrderByDescending(c => c.City).ThenByDescending(c => c.ContactName).ToList();需要說明的是,orderby操作,不支持按type排序,也不支持匿名類。比如  var q = db.Customers.OrderBy(c => c).ToList();和var q = db.Customers.OrderBy(c => new c.City,c.ContactName).ToList();會被拋出異常。但是,既然提了,大家在這個問題就不會犯錯誤,常見的錯誤是前面的操作有匿名類,再跟orderby時,比較的是類別。比如var q = db.Customers.Select(c => new c.City, c.Address ).Ord

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論