相關(guān)知識(shí)點(diǎn)sql語(yǔ)法及實(shí)例_第1頁(yè)
相關(guān)知識(shí)點(diǎn)sql語(yǔ)法及實(shí)例_第2頁(yè)
相關(guān)知識(shí)點(diǎn)sql語(yǔ)法及實(shí)例_第3頁(yè)
相關(guān)知識(shí)點(diǎn)sql語(yǔ)法及實(shí)例_第4頁(yè)
相關(guān)知識(shí)點(diǎn)sql語(yǔ)法及實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩100頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、目錄LINQ to SQL 語(yǔ)句(1)之 Where6Where 操作6簡(jiǎn)單形式:6關(guān)系條件形式:73.()形式:7LINQ to SQL 語(yǔ)句(2)之 Select/Distinct8簡(jiǎn)單用法:8類型 形式:8條件形式:9指定類 型形式:10篩選形式:10shd 形式(整形類型):11嵌套類型形式:11本地方法調(diào)用 形式(LocalMethodCall):11Distinct 形式:12LINQ to SQL 語(yǔ)句(3)之 Count/Sum/Max/Avg13簡(jiǎn)單形式:13帶條件形 式:14簡(jiǎn)單形式:142.形式:143.元素 :151.簡(jiǎn)單形式:152.形式:153.元素:151.簡(jiǎn)單形

2、式:162.形式:163.元素:16LINQ to SQL 語(yǔ)句(4)之 Join17Join 操作符17一對(duì)多關(guān)系(1 to Many):17多對(duì)多關(guān)系(Many to Many):18自聯(lián)接關(guān)系:19雙向聯(lián)接(Two way join):19三向聯(lián)接(There way join):20左外部聯(lián)接(Left Outer Join):21投影的 Let 賦值(Projected let assignment):215.組合鍵(Comite Key):226.可為 null/不可為 null 的鍵關(guān)系 (Nullable/Nonnullable Key Relationship):23LINQ

3、 to SQL 語(yǔ)句(5)之 Order By23Order By 操作23簡(jiǎn)單形式23帶條件形式24降序排序24ThenBy24ThenByDescending26帶GroupBy 形式26LINQ to SQL 語(yǔ)句(6)之 Group By/Having27Group By/Having 操作符27簡(jiǎn)單形式:27Select類 :28最大最小平均值29值30值306.求和307.計(jì)數(shù)31帶條件計(jì)數(shù)31Where 限制32多列(Multiple Columns)3211.表達(dá)式(Expres) 33LINQ to SQL 語(yǔ)句(7)之 Exists/In/Any/All/Contains3

4、3Exists/In/Any/All/Contains 操作符33Any33簡(jiǎn)單形式:33帶條件形式:34All34Contains35包含一個(gè)對(duì)象:35包含多個(gè)值:36LINQ to SQL 語(yǔ)句(8)之 Concat/Union/ersect/Except36Concat/Union/ersect/Except 操作36Concat(連接)36簡(jiǎn)單形式:37復(fù) 合形式:37Union(合并)37ersect(相交)38Except(與非)38LINQ to SQL 語(yǔ)句(9)之 Tottom 和 Paging 和 SqlMethods39Tottom 操作39Take39Skip39Tak

5、eWhile40SkipWhile40Paging(分頁(yè))操作401.索引402.按唯一鍵排序40SqlMethods 操作41Like41已編譯查 詢操作(Compiled Query)42LINQ to SQL 語(yǔ)句(10)之 Insert42(Insert)1.簡(jiǎn)單形式42一對(duì)多 關(guān)系43多對(duì)多關(guān)系43使用動(dòng)態(tài) CUD 重寫(Override using Dynamic CUD)44LINQ to SQL 語(yǔ)句(11)之 Update45更新(Update)45簡(jiǎn)單形式45多項(xiàng)更改45LINQ to SQL 語(yǔ)句(12)之 Delete 和使用 Attach46刪除(Delete)1.簡(jiǎn)

6、單形式46一對(duì)多關(guān)系46推理刪除(Inferred Delete)47使用Attach 更新(Update wittach)47LINQ to SQL 語(yǔ)句(13)之開放式并發(fā)控制和事務(wù)50Simultaneous Changes 開放式并發(fā)控制50開放式并發(fā)(Optimistic Concurrency)50Implicit(隱式)52Explicit(顯式)52LINQ to SQL 語(yǔ)句(14)之 Null 語(yǔ)義和 DateTime53Null 語(yǔ)義53Null53Nullable.HasValue54日期函數(shù)54DateTime.Year55DateTime.Month55DateTi

7、me.Day55LINQ to SQL 語(yǔ)句(15)之 String55字符串(String)55字符 串串聯(lián)(String Concatenation)56String.Length563.String.Containbstring)56String.IndexOf(substring)56String.StartsWith (prefix)57String.EndsWith(suffix)57String.Substring(start)57String.Substring (start, length)57String.ToUpper()58String.ToLower()58Strin

8、g.Trim()5812.String.Insert(, str)58String.Remove(start)59String.Remove(start, length)59String.Replace(find, replace)59LINQ to SQL 語(yǔ)句(16)之對(duì)象標(biāo)識(shí)60對(duì)象標(biāo)識(shí)60對(duì)象緩存60LINQ to SQL 語(yǔ)句(17)之對(duì)象加載61對(duì)象加載延遲加載61預(yù)先加載:LoadWith 方法62LINQ to SQL 語(yǔ)句(18)之運(yùn)算符轉(zhuǎn)換63AsEnumerable:將類型轉(zhuǎn)換為泛型 IEnumerable63ToArray:將序列轉(zhuǎn)換為數(shù)組63ToList:將序列轉(zhuǎn)換為

9、 泛型列表63ToDictionary:將序 列轉(zhuǎn)化為字典64LINQ to SQL 語(yǔ)句(19)之 ADO.NET 與 LINQ to SQL641.連接652.事務(wù)65LINQ to SQL 語(yǔ)句(20)之過(guò)程67標(biāo)量返回67單一結(jié) 果集68多個(gè)可 能形狀的單一結(jié)果集69多個(gè)結(jié)果集74帶輸出參數(shù)83LINQ to SQL 語(yǔ)句(21)之用戶定義函數(shù)84在 Select 中使用用戶定義的標(biāo)量函數(shù)84在 Where 從句中 使用用戶定義的標(biāo)量函數(shù)85使用用戶定義的表值函數(shù)87以聯(lián)接方式使用用戶定義的表值函數(shù)88LINQ to SQL 語(yǔ)句(22)之 Dontext89創(chuàng)建和刪除數(shù)據(jù)庫(kù)89數(shù)據(jù)庫(kù)

10、驗(yàn)證92數(shù)據(jù)庫(kù)更改929394LINQ to SQL 語(yǔ)句(23)之動(dòng)態(tài)查詢94Select95Where96LINQ to SQL 語(yǔ)句(24)之視圖98LINQ to SQL 語(yǔ)句(25)之繼承100一般形式101OfType 形式102IS 形式102AS 形式103動(dòng)態(tài)查詢?nèi)罩綜ast 形式103UseAsDefault 形式1047.新的105LINQ to SQL 語(yǔ)句(1)之 WhereWhere 操作適用場(chǎng)景:實(shí)現(xiàn)過(guò)濾,查詢等功能。說(shuō)明:與 SQL 命令中的 Where 作用相似,都是起到范圍限定也就是過(guò)濾作用的 ,而判斷條件就是它后面所接的子句。Where 操作包括 3 種形

11、式,分別為簡(jiǎn)單形式、關(guān)系條件形式、舉例下:()形式。下面分別用實(shí)例1.簡(jiǎn)單形式:例如:使用where 篩選在倫敦的客戶var q =from c in db.Customers where c.City = London select c;再如:篩選 1994 年或之后雇用的雇員:var q =from e in db.Employeeswhere e.HireDate = new DateTime(1994, 1, 1) select e;2.關(guān)系條件形式:篩選庫(kù)存量在訂貨點(diǎn)水平之下但未斷貨的產(chǎn)品:var q =from p in db.Productswhere p.UnitsInStoc

12、k 10m | p.Discontinued select p;下面這個(gè)例子是調(diào)用兩次where 以篩選出 UnitPrice 大于 10 且已停產(chǎn)的產(chǎn)品。var q =db.Products.Where(p=p.UnitPrice 10m).Where (p=p.Discontinued);()形式:3.返回集合中的一個(gè)元素,其實(shí)質(zhì)就是在 SQL 語(yǔ)句中加 TOP (1)。簡(jiǎn)單用法:選擇表中的第一個(gè)發(fā)貨方。Shipper shipper = db.Shippers.();元素:選擇 CustomerID 為“BONAP”的單個(gè)客戶Customer cust = db.Customers.(c

13、 = c.CustomerID = BONAP);條件:選擇運(yùn)費(fèi)大于 10.00 的訂單:Order ord = db.Orders.(o = o.Freight 10.00M);LINQ to SQL 語(yǔ)句(2)之 Select/Distinct1 Select 介紹 12 Select 介紹 23 Select 介紹 3 和 Distinct 介紹Select/Distinct 操作符適用場(chǎng)景:o(_) o 查詢唄。說(shuō)明:和 SQL 命令中的 select 作用相似但位置不同, 查詢表達(dá)式中的 select 及所接子句是放在表達(dá)式最后并把子句中的變量也就是結(jié) 果返回回來(lái);延遲。Select

14、/Distinct 操作包括 9 種形式,分別為簡(jiǎn)單用 法、類型形式、條件形式、指定類型形式、篩選形式、整形類型形式、嵌套 類型形式、本地方法調(diào)用形式、Distinct 形式。1.簡(jiǎn)單用法:這個(gè)示 例返回僅含客戶聯(lián)系人的序列。var q =from c in db.Customers select c.ContactName;注意:這個(gè)語(yǔ)句 只是一個(gè)或者一個(gè)描述,并沒(méi)有真正把數(shù)據(jù)取出來(lái),只有當(dāng)你需要該數(shù)據(jù)的 時(shí)候,它才會(huì)執(zhí)行這個(gè)語(yǔ)句,這就是延遲加載(deferred loading)。如果,在的時(shí)候就返回的結(jié)果集是對(duì)象的集合。你可以使用 ToList() 或 ToArray()方法 把查詢結(jié)果

15、先進(jìn)行保存,然后再對(duì)這個(gè)集合進(jìn)行查詢。當(dāng)然延遲加載(deferred loading)可以像拼接 SQL 語(yǔ)句那樣拼接查詢語(yǔ)法,再執(zhí)行它。2.類型 形式:說(shuō)明:類來(lái)幫助類型是 C#3.0 中新特性。其實(shí)質(zhì)是編譯器根據(jù)自定義自 動(dòng)產(chǎn)生一個(gè)的實(shí)現(xiàn)臨時(shí)變量的。類型還依賴于另外一 個(gè)特性:支持根據(jù) property來(lái)創(chuàng)建對(duì)象。比如,var d = new Name = s ;編譯器自動(dòng)產(chǎn)生一個(gè)有 property 叫做Name 的類,然后按這 個(gè)類型分配內(nèi)存,并初始化對(duì)象。但是 var d = new s;是編譯不 通過(guò)的。因?yàn)?,編譯器不知道類中的 property 的名字。例如 string c =

16、 d;var d = new c; 則是可以通過(guò)編譯的。編譯器會(huì)創(chuàng)建一個(gè)叫 做類帶有叫 c 的 property。例如下例:new c,ContactName,c.Phone;ContactName 和 Phone 都是在文件中定義與表類,這個(gè) 類有中字 段相對(duì)應(yīng)的 property。編譯器數(shù)據(jù)并創(chuàng)建對(duì)象時(shí),會(huì)創(chuàng)建一個(gè)兩個(gè)屬性,為 ContactName 和 Phone,然后根據(jù)數(shù)據(jù)初始化對(duì)象。另外編譯器 還可以重命名 property 的名字。var q =from c in db.Customersselect new c.ContactName, c.Phone;上 面語(yǔ)句描述:使用 S

17、ELECT 和類型返回僅含客戶聯(lián)系人和號(hào)碼的序 列var q =from e in db.Employees select newName = e.Name + + e.LastName,Phone = e.HomePhone;上面 語(yǔ)句描述:使用 SELECT 和類型返回僅含雇員和號(hào)碼的序列,并將Name 和 LastName 字段合并為一個(gè)字段“Name”,此外在所得的 序列中將 HomePhone字段重命名為Phone。var q =from p in db.Products select newp.ProductID,HalfPrice = p.UnitPrice / 2;上面語(yǔ)句描述

18、:使用 SELECT 和除以 2 所得的值)的序列。類型返回所有產(chǎn)品的 ID 以及 HalfPrice(設(shè)置為產(chǎn)品單價(jià)3.條件形式:說(shuō) 明:生成 SQL 語(yǔ)句為:case when condition then else。var q =from p in db.Products select newp.ProductName, Availability =p.UnitsInStock - p.UnitsOnOrder 0.0select od,FreeShipDiscount = o.Freight;語(yǔ)句描述:使用嵌套查詢返回所有訂單及其 OrderID 的序列 、打折訂單中項(xiàng)目的子序列以及免

19、送貨所省下的金額。8.本地方法調(diào)用 形式(LocalMethodCall):這個(gè)例子在查詢中調(diào)用本地方法 PhoneNumberConverter 將號(hào)碼轉(zhuǎn)換為國(guó)際格式。var q = from c in db.Customerswhere c.Country = UK | c.Country = USA select newc.CustomerID,panyName, Phone = c.Phone,ernationalPhone = PhoneNumberConverter(c.Country, c.Phone);PhoneNumberConverter 方法如下:public strin

20、g PhoneNumberConverter(string Country, string Phone)Phone = Phone.Replace( , ).Replace (), )-); switch (Country)case USA:return 1- + Phone; case UK:return 44- + Phone; default:return Phone;下面也是使用了這個(gè)方法將號(hào)碼轉(zhuǎn)換為國(guó)際格式并創(chuàng)建XXdoc = new X(new XElement(Customers, from c in db.Customerswhere c.Country = UK | c.Co

21、untry = USA select (new XElement (Customer,new XAttribute (CustomerID, c.CustomerID),new XAttribute(CompanyName,new XAttribute(erationalPhone,panyName),PhoneNumberConverter(c.Country, c.Phone);9.Distinct 形式:說(shuō)明:篩選字段中不相同的值 。用于查詢不重復(fù)的結(jié)果集。生成 SQL 語(yǔ)句為:SELECT DISTINCTCity FROM Customersvar q = (from c in db

22、.Customers select c.City ).Distinct();語(yǔ)句描述:查詢顧 客覆蓋的國(guó)家。語(yǔ)句之LINQtoSQL(3)Count/Sum/Max/Avg1 Count/Sum 講解2 Min 講解3 Max 講解4 Average 和 Aggregate 講解Count/Sum/Max/Avg 操作符適用場(chǎng)景: 統(tǒng)計(jì)數(shù)據(jù)吧,比如統(tǒng)計(jì)一些數(shù)據(jù)的個(gè)數(shù),求和,最小值,最大值,平均數(shù)。Count說(shuō)明:返回集合中的元素個(gè)數(shù),返回FROM類型;不延遲。生成 SQL 語(yǔ)句為:SELECT COUNT(*)1.簡(jiǎn)單形式:得到數(shù)據(jù)庫(kù)中客戶 的數(shù)量:var q = db.Customers.C

23、ount();2.帶條件形 式:得到數(shù)據(jù)庫(kù)中未斷貨產(chǎn)品的數(shù)量:var q = db.Products.Count(p = !p.Discontinued);LongCount說(shuō)明 :返回集合中的元素個(gè)數(shù),返回 LONG 類型;不延遲。對(duì)于元素個(gè)數(shù)較多的集合可 視情況可以選用 LongCount 來(lái)統(tǒng)計(jì)元素個(gè)數(shù),它返回 long 類型,比較精確。生成 SQL 語(yǔ)句為: SELECT COUNT_BIG(*) FROMvar q = db.Customers.LongCount();Sum說(shuō)明:返回集合中數(shù)值類型元SELECT SUM() FROM和,集合應(yīng)為類型集合;不延遲。生成 SQL 語(yǔ)句為

24、:1.簡(jiǎn)單形式:得到所有訂單的總運(yùn)費(fèi):var q = db.Orderect(o = o.Freight).Sum();形式:2.得 到所有產(chǎn)品的訂貨總數(shù):var q = db.ProductMinm(p = p.UnitsOnOrder);說(shuō)明:返回集合中元素的最小值;不延遲。 生成 SQL 語(yǔ)句為:SELECT MIN() FROM 1.簡(jiǎn)單形式:查找任 意產(chǎn)品的最低單價(jià):var q = db.Productect(p = p.UnitPrice).Min();2.形式:查找任意訂單的最低運(yùn)費(fèi):var q = db.Orders.Min(o = o.Freight);3.元素 :查找每個(gè)類

25、別中單價(jià)最低的產(chǎn)品:var categories =from p in db.Productsgroup p by p.CategoryIDo g select new CategoryID = g.Key,ChestProducts =from p2 in gwhere p2.UnitPrice = g.Min(p3 = p3.UnitPrice) select p2;Max說(shuō)明:返回集合中元素的最大值;不延 遲。生成 SQL 語(yǔ)句為:SELECT MAX() FROM1.簡(jiǎn)單形式:查 找任意雇員的最近雇用日期:var q = db.Employeeect(e = e.HireDate).M

26、ax();形式:2.查找任意產(chǎn)品的最大庫(kù)存量:var q = db.Products.Max(p = p.UnitsInStock);3.元素:查找每個(gè)類別中單價(jià)最高的產(chǎn)品:var categories =from p in db.Products group p by p.CategoryID select new g.Key,o gMostExpensiveProducts =from p2 in gwhere p2.UnitPrice = g.Max(p3 = p3.UnitPrice) select p2;Average說(shuō)明:返回集合中的數(shù)值類型元素的平均值。集合應(yīng)為數(shù)字類型集合,其返

27、回double;不延遲。生成 SQL 語(yǔ)句為:SELECT AVG() FROM值類型為1.簡(jiǎn)單形式:得到所有訂單的平均運(yùn)費(fèi):var q = db.Orderect(o = o.Freight).Average();形式:2.得到所有產(chǎn)品的平均單價(jià):var q = db.Products.Average(p = p.UnitPrice);3.元素:查找每個(gè)類別中單價(jià)高于該類別平 均單價(jià)的產(chǎn)品:var categories =from p in db.Productsgroup p by p.CategoryIDo g select new g.Key, ExpensiveProducts =f

28、rom p2 in gwhere p2.UnitPrice g.Average (p3 = p3.UnitPrice)select p2;Aggregate說(shuō)明:根據(jù)輸入的表達(dá)式獲取聚合值;不延遲。即 是說(shuō):用一個(gè)值與當(dāng)前元素通過(guò)指定的函數(shù)來(lái)進(jìn)行對(duì)比來(lái)遍歷集合中的元素 ,符合條件的元素保留下來(lái)。如果沒(méi)有指定值的話,值默認(rèn)為集合的第 一個(gè)元素。LINQ to SQL 語(yǔ)句(4)之 JoinJoin 操作符適用場(chǎng)景:在表關(guān)系中有一對(duì)一關(guān)系,一對(duì)多關(guān)系, 多對(duì)多關(guān)系等。對(duì)各個(gè)表之間的關(guān)系,就用這些實(shí)現(xiàn)對(duì)多個(gè)表的操作。說(shuō)明:在 Join 操作中,分別為 Join(Join 查詢), SelectMan

29、y(Select 一對(duì)多選擇) 和GroupJoin(分組 Join 查詢)。該擴(kuò)展方法對(duì)兩個(gè)序列中鍵匹配的元素進(jìn) 行 inner join 操作SelectMany說(shuō)明:在寫查詢語(yǔ)句時(shí),如果 被翻譯成 SelectMany 需要滿足 2 個(gè)條件。1:查詢語(yǔ)句中沒(méi)有 join 和o,2:必 須出現(xiàn) EntitySet。在表關(guān)系中有一對(duì)一關(guān)系,一對(duì)多關(guān)系,多對(duì)多關(guān)系等 ,下面分別介紹一下。1.一對(duì)多關(guān)系(1 to Many):var q =from c in db.Customers from o in c.Orderswhere c.City = Londonselect o;語(yǔ)句描述:Cus

30、tomers 與 Orders 是一對(duì)多關(guān)系。即 Orders 在 Customers 類中以 EntitySet 形式出現(xiàn)。所以第二個(gè) from 是從 c.Orders 而不是 db.Orders 里進(jìn)行篩選 。這個(gè)例子在 From 子句中使用外鍵導(dǎo)航選擇倫敦客戶的所有訂單。var q =from p in db.Productswhere p.select p;r.Country = USA & p.UnitsInStock = 0語(yǔ)句描述:這一句使用了 p.r.Country 條件,間接關(guān)聯(lián)了r 表。這個(gè)例子在 Where子句中使 用外鍵導(dǎo)航篩選其供應(yīng)商在且缺貨的產(chǎn)品。生成 SQL 語(yǔ)句

31、為:SELECT t0.ProductID, t0.ProductName, t0. rID,t0.CategoryID,t0.tyPerUnit,t0. UnitPrice,t0.UnitsInStock, t0.UnitsOnOrder,t0. ReorderLevel,t0.Discontinued FROM dbo.Products AS t0LEFT OUTER JOIN dbo.rs AS t1 ONrIDt1. rID = t0.WHERE (t1.Country = p0) AND (t0.UnitsInStock = p1)- p0: Input NVarChar (Size

32、 = 3; Prec = 0; Scale = 0) USA- p1: Input(Size = 0; Prec = 0; Scale = 0) 02.多對(duì)多關(guān)系(Many to Many):var q =from e in db.Employeesfrom et in e.EmployeeTerritories where e.City = Seattleselect newe.Name,e.LastName,et.Territory.TerritoryDescription;說(shuō)明:多對(duì)多關(guān)系一般會(huì)涉及三個(gè)表(如果有一個(gè)表是自關(guān)聯(lián)的,那有可能只有 2 個(gè)表)。這一句語(yǔ)句涉及 Employee

33、s, EmployeeTerritories, Territories 三個(gè)表。它們的關(guān)系是 1:M:1。 Employees 和 Territories 沒(méi)有很明確的關(guān)系。語(yǔ)句描述:這個(gè)例子在 From 子句中使 用外鍵導(dǎo)航篩選在西雅圖的雇員,同時(shí)列出其所在地區(qū)。這條生成SQL 語(yǔ)句為:SELECT t0.Name, t0.LastName, t2. TerritoryDescriptionFROM dbo.Employees AS t0 CROSS JOIN dbo.EmployeeTerritoriesAS t1 INNER JOIN dbo. Territories AS t2 ON

34、t2.TerritoryID = t1.TerritoryIDWHERE (t0.City = p0) AND (t1.EmployeeID = t0. EmployeeID)- p0: Input NVarChar (Size = 7; Prec = 0; Scale = 0) Seattle3.自聯(lián)接關(guān)系:var q =from e1 in db.Employees from e2 in e1.Employees where e1.City = e2.City select new Name1 = e1. Name2 = e2.e1.City;Name, LastName1 = e1.La

35、stName,Name, LastName2 = e2.LastName,語(yǔ)句描述:這個(gè)例子在 select 子句中使用外鍵導(dǎo)航篩選成 對(duì)的雇員,每對(duì)中一個(gè)雇員隸屬于另一個(gè)雇員,且兩個(gè)雇員都來(lái)自相同城市。生 成 SQL 語(yǔ)句為:SELECT t0.Name AS Name1, t0.LastName ASLastName1,t1.Name AS Name2, t1.LastName ASLastName2,t0.City FROM dbo.Employees AS t0,dbo.Employees AS t1 WHERE (t0.City = t1. City) AND (t1.Reports

36、To = t0.EmployeeID)GroupJoin像上面所說(shuō)的,沒(méi)有 join 和o,被翻譯成 SelectMany,同時(shí)有 join 和o 時(shí),那么就被翻譯為 GroupJoin。在這里o 的 概念是對(duì)其結(jié)果進(jìn)行重新命名。1.雙向聯(lián)接(Two way join):此 示例顯式聯(lián)接兩個(gè)表并從這兩個(gè)表投影出結(jié)果:var q =from c in db.Customersjoin o in db.Orders on c.CustomerIDequals o.CustomerIDselect newc.ContactName,o ordersOrderCount = orders.Count

37、();說(shuō)明:在一對(duì)多關(guān)系中,左邊是 1,它每條為 c(from c in db.Customers),右邊是 Many,其每條叫做o ( join o in db.Orders ),每對(duì)應(yīng)左邊的一個(gè) c,就會(huì)有一組o,那這一組 o,就叫做 orders, 也就是說(shuō),把一組 o 命名為 orders,這就是o 用途。這也就是為什么在 select 語(yǔ)句中,orders 可以調(diào)用聚合函數(shù) Count。在 T-SQL 中,使用其內(nèi)嵌的 T- SQL 返回值作為字。:生成 SQL 語(yǔ)句為:SELECT t0.ContactName, (SELECT COUNT(*)FROM dbo.Orders AS

38、 t1WHERE t0.CustomerID = t1.CustomerID) AS OrderCountFROM dbo.Customers AS t02.三向聯(lián)接(There way join):此示例顯式聯(lián)接三個(gè)表并分別從每個(gè)表投影出結(jié)果:var q =from c in db.Customersjoin o in db.Orders on c.CustomerIDequals o.CustomerIDo ordsjoin e in db.Employees on c.Cityequals e.Cityselect newo empsc.ContactName,ords = ords.C

39、ount(), emps = emps.Count();生成 SQL 語(yǔ)句為:SELECT t0. ContactName, (SELECT COUNT(*)FROM dbo.Orders AS t1WHERE t0.CustomerID = t1.CustomerID) AS ords, ( SELECT COUNT(*)FROM dbo.Employees AS t2 WHERE t0.City = t2.City) AS empsFROM dbo.Customers AS t03.左外部聯(lián)接(Left Outer Join):此示例說(shuō)明如何通過(guò)使用 此示例說(shuō)明如何通過(guò)使用雇員沒(méi)有訂單時(shí),

40、DefaultIfEmpty()方 法返回 null:DefaultIfEmpty() 獲取左外部聯(lián)接。在var q =from e in db.Employeesjoin o in db.Orders on e equals o.Employeeo ords from o in ords.DefaultIfEmpty()select newe.Name,e.LastName,Order = o;說(shuō)明:以 Employees 左表,Orders 右表,Orders 表中為空時(shí), 用 null 值填充。Join 的結(jié)果重命名 ords,使用 DefaultIfEmpty()函數(shù)對(duì)其再次查 詢。其

41、最后的結(jié)果中有個(gè) Order,因?yàn)?from o in ords.DefaultIfEmpty() 是對(duì) ords 組再一次遍歷,所以,最后結(jié)果中的 Order 并不是一個(gè)集合。但是,如果沒(méi) 有from o in ords.DefaultIfEmpty() 這句,最后的select 語(yǔ)句寫成select new e. Name, e.LastName, Order = ords 的話,那么 Order 就是一個(gè)集合。4.投影的 Let 賦值(Projected let assignment):說(shuō)明:let 語(yǔ)句 是重命名。let 位于第一個(gè) from 和 select 語(yǔ)句之間。這個(gè)例子從聯(lián)接

42、投影 出最終“Let”表達(dá)式:var q =from c in db.Customersjoin o in db.Orders on c.CustomerID equals o.CustomerIDo ordslet z = c.City + c.Country from o in ordsselect newc.ContactName, o.OrderID,z;5.組合鍵(Comite Key):這個(gè)例子顯示帶有組合 鍵的聯(lián)接:var q =from o in db.Orders from p in db.Products join d in db.OrderDetailson newo.O

43、rderID, p.ProductID equalsnewd.OrderID, d.ProductIDo details from d in details select newo.OrderID, p.ProductID, d.UnitPrice;說(shuō)明:使用三個(gè)表,并且用類來(lái)說(shuō)明:使用三個(gè)表,并 且用類來(lái)表示它們之間的關(guān)系。它們之間的關(guān)系不能用一個(gè)鍵描述清楚,所 以用類,來(lái)表示組合鍵。還有一種是兩個(gè)表之間是用組合鍵表示關(guān)系的,不 需要使用類。6.可為 null/不可為 null 的鍵關(guān)系 (Nullable/NonnullableRelationship):Key這個(gè)實(shí)例顯示如何構(gòu)造一 側(cè)可

44、為 null 而另一側(cè)不可為 null 的聯(lián)接:var q =from o in db.Orders join e in db.Employeeson o.EmployeeID equals(?)e.EmployeeIDfrom e in emps select newo.OrderID,o empse.Name;LINQ to SQL 語(yǔ)句(5)之 Order ByOrder By 操作適用場(chǎng)景:對(duì)查詢出的語(yǔ)句進(jìn)行排序,比如按時(shí)間排序 等等。說(shuō)明:按指定表達(dá)式對(duì)集合排序;延遲,:按指定表達(dá)式對(duì)集合 排序;延遲,默認(rèn)是升序,加上 descending 表示降序,對(duì)應(yīng)的擴(kuò)展方法是 OrderBy

45、 和 OrderByDescending1.簡(jiǎn)單形式這個(gè)例子使用 orderby 按雇用日期對(duì)雇員進(jìn)行排序:var q =from e in db.Employees orderby e.HireDate select e;說(shuō)明:默認(rèn)為升序2.帶條件形式注意:Where 和 Order By 的順序并不重要。而在T-SQL 中,Where 和 Order By 有嚴(yán)格的位置限制 。var q =from o in db.Orderswhere o.ShipCity = London orderby o.Freightselect o;語(yǔ)句描述:使用where 和orderby 按運(yùn)費(fèi)進(jìn)行排序。

46、3.降序排序var q =from p in db.Productsorderby p.UnitPrice descending select p;4.ThenBy語(yǔ)句描述:使用復(fù)合的 orderby 對(duì)客戶進(jìn)行排序,進(jìn)行排序:var q =from c in db.Customers orderby c.City, c.ContactName select c;說(shuō)明:按多個(gè)表達(dá)式進(jìn)行排序,例如先按 City 排序,當(dāng) City 相 同時(shí),按 ContactName 排序。這一句用 Lambda 表達(dá)式像這樣寫:var q =.OrderBy(c = c.City).ThenBy(c = c.

47、ContactName).ToList();在 T-SQL 中沒(méi)有 ThenBy 語(yǔ)句,其依然翻譯為OrderBy,所以也可以用下面語(yǔ)句來(lái)表達(dá):var q =db.Customers.OrderBy(c = c.ContactName).OrderBy(c = c.City).ToList ();所要注意的是,多個(gè) OrderBy 操作時(shí),級(jí)連方式是按逆序。對(duì) 于降序的,用相應(yīng)的降序操作符替換即可。var q =db.Customers.OrderByDescending(c = c.City).ThenByDescending(c = c.ContactName).ToList();需明的是

48、,OrderBy 操作,不支持按type 排序,也不支持類。比如var q =db.Customers.OrderBy(c = newc.City, c.ContactName).ToList();會(huì)被拋出異常。錯(cuò)誤是前面的操作有類,再 跟 OrderBy 時(shí),比較的是類別。比如var q =db.Customers.Select(c = newc.City, c.Address).OrderBy(c = c).ToList();如果你想使用OrderBy(c = c),其前提條件是 ,前面步驟中,所產(chǎn)生的對(duì)象的類別必須為C#語(yǔ)言的基本類型。比如下句,這里 City 為 string 類型。v

49、ar q =db.Customers.Select(c = c.City).OrderBy(c = c).ToList ();5.ThenByDescending這兩個(gè)擴(kuò)展方式都 是用在OrderBy/OrderByDescending 之 后 的 , 第 一 個(gè)ThenBy/ThenByDescending 擴(kuò)展方法 作為第二位排序依據(jù),第二個(gè)ThenBy/ThenByDescending則作為第三位排序依據(jù) ,以此類推var q =from o in db.Orderswhere o.EmployeeID = 1orderby o.ShipCountry, o.Freight descen

50、ding select o;語(yǔ)句描述:使用 orderby 先按發(fā) 往國(guó)家再按運(yùn)費(fèi)從高到低的順序?qū)π信判?。EmployeeID 1 的訂單進(jìn)6. 帶 GroupBy 形式var q =from p in db.Products group p by p.CategoryID orderby g.Keyselect new g.Key,o gMostExpensiveProducts =from p2 in gwhere p2.UnitPrice = g.Max(p3 = p3.UnitPrice) select p2;語(yǔ)句描述:使用 orderby、Max 和 Group By 得出每種類別

51、中單價(jià)最高的產(chǎn)品,并按CategoryID 對(duì)這組產(chǎn)品進(jìn)行排序。LINQ to SQL 語(yǔ)句(6)之 Group By/HavingGroup By/Having 操作符適用場(chǎng)景:分組數(shù)據(jù),為查找數(shù)據(jù)縮小 范圍。說(shuō)明:分配并返回對(duì)傳入?yún)?shù)進(jìn)行分組操作后的可枚舉對(duì)象。分 組;延遲1.簡(jiǎn)單形式:var q =from p in db.Products group p by p.CategoryID select g;o g語(yǔ)句描述:使用Group By 按 CategoryID 劃分產(chǎn)品。說(shuō) 明:from p in db.Products 表示從表中將產(chǎn)品對(duì)象取出來(lái)。group p by p.Ca

52、tegoryIDo g表示對(duì) p 按 CategoryID 字段歸類。其結(jié)果命名為g,一旦重 新命名,p 的作用域就結(jié)束了,所以,最后select 時(shí),只能 select g。當(dāng)然,也 不必重新命名可以這樣寫:var q =from p in db.Products group p by p.CategoryID;用示意 圖表示:如果想遍歷某類別中所有,這樣:foreach (var gp in q)if (gp.Key = 2)foreach (var item in gp)/do something2.Select類 :var q =from p in db.Products group

53、p by p.CategoryIDo gselect new CategoryID = g.Key, g ;說(shuō)明:在這句 LINQ 語(yǔ)句中,有 2 個(gè) property:CategoryID 和 g。這個(gè)類,其實(shí)質(zhì)是對(duì)返回結(jié)果集重新進(jìn)行了包裝。把 g 的 property 封裝成一 個(gè)完整的分組。如下圖所示:如果想遍歷某類中所有,要這么做:foreach (var gp in q)if (gp.CategoryID = 2)foreach (var item in gp.g)/do something3.最大 值var q =from p in db.Products group p by p

54、.CategoryID select new g.Key,o gMaxPrice = g.Max(p = p.UnitPrice);語(yǔ)句描述:使用Group By 和 Max 查找每個(gè) CategoryID 的最高單價(jià)。說(shuō)明:先按 CategoryID 歸類,判斷各個(gè)分類產(chǎn)品中單價(jià)最大的 Products。取出 CategoryID值,并把 UnitPrice 值賦給MaxPrice。4.最小 值var q =from p in db.Products group p by p.CategoryID select new g.Key,o gMinPrice = g.Min(p = p.Unit

55、Price);語(yǔ)句描述:使用Group By 和 Min 查找每個(gè) CategoryID 的最低 單價(jià)。說(shuō)明:先按 CategoryID 歸類,判斷各個(gè)分類產(chǎn)品中單價(jià)最小的 Products。取出值,并把 UnitPrice 值賦給MinPrice。CategoryID5.平均 值var q =from p in db.Products group p by p.CategoryID select new g.Key,o gAveragePrice = g.Average(p = p.UnitPrice);語(yǔ)句描述:使用Group By 和 Average 得到每個(gè) CategoryID 的

56、平均單價(jià)。說(shuō)明:先按 CategoryID 歸類,取出 CategoryID 值和各個(gè)分類 產(chǎn)品中單價(jià)的平均值。6.求和var q =from p in db.Products group p by p.CategoryIDo gselect new g.Key,TotalPrice = g.Sum(p = p.UnitPrice);語(yǔ)句描述:使用Group By 和 Sum 得到 每個(gè) CategoryID 的單價(jià)總計(jì)。說(shuō)明:先按 CategoryID 歸類,取出 CategoryID 值和各個(gè)分類產(chǎn)品中單價(jià)的總和。7.計(jì)數(shù)var q =from p in db.Products group

57、 p by p.CategoryID select new g.Key,o gNumProducts = g.Count();語(yǔ)句描述:使用Group By 和 Count 得到每 個(gè) CategoryID 中產(chǎn)品的數(shù)量。說(shuō)明:先按 CategoryID 歸類,取出 CategoryID 值和各個(gè)分類產(chǎn)品的數(shù)量。8.帶條件計(jì)數(shù)var q =from p in db.Products group p by p.CategoryID select new g.Key,o gNumProducts = g.Count(p = p.Discontinued);語(yǔ)句描述:使 用Group By 和 Co

58、unt 得到每個(gè) CategoryID 中斷貨產(chǎn)品的數(shù)量。說(shuō)明:先按 CategoryID 歸類,取出CategoryID 值和各個(gè)分類產(chǎn)品的斷貨數(shù)量。Count 函數(shù)里,使用了 Lambda 表達(dá)式,Lambda 表達(dá)式中的 p,代表這個(gè)組里的一個(gè)元素或?qū)ο?,即某一個(gè)產(chǎn)品。9.Where 限制var q =from p in db.Products group p by p.CategoryID where g.Count() = 10 select new g.Key,o gProductCount = g.Count();語(yǔ)句描述:根據(jù)產(chǎn) 品的ID 分組,查詢產(chǎn)品數(shù)量大于 10 的 I

59、D 和產(chǎn)品數(shù)量。這個(gè)示例在 Group By 子句 后使用 Where 子句查找所有至少有 10 種產(chǎn)品的類別。說(shuō)明:在翻譯成SQL 語(yǔ)句時(shí),在最外層嵌套了 Where 條件。10.多列(Multiple Columns)var categories =from p in db.Products group p by newp.CategoryID,p.rIDo gselect newg.Key, g;語(yǔ)句描述:使用Group By 按 CategoryID 和rID 將產(chǎn)品分組。說(shuō)明:既按產(chǎn)品的分類,又按供應(yīng)商分類。在by 后面,new 出來(lái)一個(gè)類。這里,Keyg.Key.CategoryI

60、D其實(shí)質(zhì)是一個(gè)類的對(duì)象,Key 包含兩個(gè) Property:CategoryID、可以遍歷 CategoryID 的值。rID。用11.表達(dá)式(Expres)var categories =from p in db.Productsgroup p by new Criterion = p.UnitPrice 10 select g;o g語(yǔ)句描述 :使用 Group By 返回兩個(gè)產(chǎn)品序列。第一個(gè)序列包含單價(jià)大于 10 的產(chǎn)品。第二個(gè) 序列包含單價(jià)小于或等于 10 的產(chǎn)品。說(shuō)明:按產(chǎn)品單價(jià)是否大于 10 分類 。其結(jié)果分為兩類,大于的是一類,小于及等于為另一類。語(yǔ)句之LINQtoSQL(7)E

溫馨提示

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

評(píng)論

0/150

提交評(píng)論