




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、目錄LINQ to SQL 語句(1)之 Where6Where 操作6簡單形式:6關(guān)系條件形式:73.()形式:7LINQ to SQL 語句(2)之 Select/Distinct8簡單用法:8類型 形式:8條件形式:9指定類 型形式:10篩選形式:10shd 形式(整形類型):11嵌套類型形式:11本地方法調(diào)用 形式(LocalMethodCall):11Distinct 形式:12LINQ to SQL 語句(3)之 Count/Sum/Max/Avg13簡單形式:13帶條件形 式:14簡單形式:142.形式:143.元素 :151.簡單形式:152.形式:153.元素:151.簡單形
2、式:162.形式:163.元素:16LINQ to SQL 語句(4)之 Join17Join 操作符17一對多關(guān)系(1 to Many):17多對多關(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 語句(5)之 Order By23Order By 操作23簡單形式23帶條件形式24降序排序24ThenBy24ThenByDescending26帶GroupBy 形式26LINQ to SQL 語句(6)之 Group By/Having27Group By/Having 操作符27簡單形式:27Select類 :28最大最小平均值29值30值306.求和307.計(jì)數(shù)31帶條件計(jì)數(shù)31Where 限制32多列(Multiple Columns)3211.表達(dá)式(Expres) 33LINQ to SQL 語句(7)之 Exists/In/Any/All/Contains3
4、3Exists/In/Any/All/Contains 操作符33Any33簡單形式:33帶條件形式:34All34Contains35包含一個(gè)對象:35包含多個(gè)值:36LINQ to SQL 語句(8)之 Concat/Union/ersect/Except36Concat/Union/ersect/Except 操作36Concat(連接)36簡單形式:37復(fù) 合形式:37Union(合并)37ersect(相交)38Except(與非)38LINQ to SQL 語句(9)之 Tottom 和 Paging 和 SqlMethods39Tottom 操作39Take39Skip39Tak
5、eWhile40SkipWhile40Paging(分頁)操作401.索引402.按唯一鍵排序40SqlMethods 操作41Like41已編譯查 詢操作(Compiled Query)42LINQ to SQL 語句(10)之 Insert42(Insert)1.簡單形式42一對多 關(guān)系43多對多關(guān)系43使用動(dòng)態(tài) CUD 重寫(Override using Dynamic CUD)44LINQ to SQL 語句(11)之 Update45更新(Update)45簡單形式45多項(xiàng)更改45LINQ to SQL 語句(12)之 Delete 和使用 Attach46刪除(Delete)1.簡
6、單形式46一對多關(guān)系46推理刪除(Inferred Delete)47使用Attach 更新(Update wittach)47LINQ to SQL 語句(13)之開放式并發(fā)控制和事務(wù)50Simultaneous Changes 開放式并發(fā)控制50開放式并發(fā)(Optimistic Concurrency)50Implicit(隱式)52Explicit(顯式)52LINQ to SQL 語句(14)之 Null 語義和 DateTime53Null 語義53Null53Nullable.HasValue54日期函數(shù)54DateTime.Year55DateTime.Month55DateTi
7、me.Day55LINQ to SQL 語句(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 語句(16)之對象標(biāo)識(shí)60對象標(biāo)識(shí)60對象緩存60LINQ to SQL 語句(17)之對象加載61對象加載延遲加載61預(yù)先加載:LoadWith 方法62LINQ to SQL 語句(18)之運(yùn)算符轉(zhuǎn)換63AsEnumerable:將類型轉(zhuǎn)換為泛型 IEnumerable63ToArray:將序列轉(zhuǎn)換為數(shù)組63ToList:將序列轉(zhuǎn)換為
9、 泛型列表63ToDictionary:將序 列轉(zhuǎn)化為字典64LINQ to SQL 語句(19)之 ADO.NET 與 LINQ to SQL641.連接652.事務(wù)65LINQ to SQL 語句(20)之過程67標(biāo)量返回67單一結(jié) 果集68多個(gè)可 能形狀的單一結(jié)果集69多個(gè)結(jié)果集74帶輸出參數(shù)83LINQ to SQL 語句(21)之用戶定義函數(shù)84在 Select 中使用用戶定義的標(biāo)量函數(shù)84在 Where 從句中 使用用戶定義的標(biāo)量函數(shù)85使用用戶定義的表值函數(shù)87以聯(lián)接方式使用用戶定義的表值函數(shù)88LINQ to SQL 語句(22)之 Dontext89創(chuàng)建和刪除數(shù)據(jù)庫89數(shù)據(jù)庫
10、驗(yàn)證92數(shù)據(jù)庫更改929394LINQ to SQL 語句(23)之動(dòng)態(tài)查詢94Select95Where96LINQ to SQL 語句(24)之視圖98LINQ to SQL 語句(25)之繼承100一般形式101OfType 形式102IS 形式102AS 形式103動(dòng)態(tài)查詢?nèi)罩綜ast 形式103UseAsDefault 形式1047.新的105LINQ to SQL 語句(1)之 WhereWhere 操作適用場景:實(shí)現(xiàn)過濾,查詢等功能。說明:與 SQL 命令中的 Where 作用相似,都是起到范圍限定也就是過濾作用的 ,而判斷條件就是它后面所接的子句。Where 操作包括 3 種形
11、式,分別為簡單形式、關(guān)系條件形式、舉例下:()形式。下面分別用實(shí)例1.簡單形式:例如:使用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)系條件形式:篩選庫存量在訂貨點(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 語句中加 TOP (1)。簡單用法:選擇表中的第一個(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 語句(2)之 Select/Distinct1 Select 介紹 12 Select 介紹 23 Select 介紹 3 和 Distinct 介紹Select/Distinct 操作符適用場景:o(_) o 查詢唄。說明:和 SQL 命令中的 select 作用相似但位置不同, 查詢表達(dá)式中的 select 及所接子句是放在表達(dá)式最后并把子句中的變量也就是結(jié) 果返回回來;延遲。Select
14、/Distinct 操作包括 9 種形式,分別為簡單用 法、類型形式、條件形式、指定類型形式、篩選形式、整形類型形式、嵌套 類型形式、本地方法調(diào)用形式、Distinct 形式。1.簡單用法:這個(gè)示 例返回僅含客戶聯(lián)系人的序列。var q =from c in db.Customers select c.ContactName;注意:這個(gè)語句 只是一個(gè)或者一個(gè)描述,并沒有真正把數(shù)據(jù)取出來,只有當(dāng)你需要該數(shù)據(jù)的 時(shí)候,它才會(huì)執(zhí)行這個(gè)語句,這就是延遲加載(deferred loading)。如果,在的時(shí)候就返回的結(jié)果集是對象的集合。你可以使用 ToList() 或 ToArray()方法 把查詢結(jié)果
15、先進(jìn)行保存,然后再對這個(gè)集合進(jìn)行查詢。當(dāng)然延遲加載(deferred loading)可以像拼接 SQL 語句那樣拼接查詢語法,再執(zhí)行它。2.類型 形式:說明:類來幫助類型是 C#3.0 中新特性。其實(shí)質(zhì)是編譯器根據(jù)自定義自 動(dòng)產(chǎn)生一個(gè)的實(shí)現(xiàn)臨時(shí)變量的。類型還依賴于另外一 個(gè)特性:支持根據(jù) property來創(chuàng)建對象。比如,var d = new Name = s ;編譯器自動(dòng)產(chǎn)生一個(gè)有 property 叫做Name 的類,然后按這 個(gè)類型分配內(nèi)存,并初始化對象。但是 var d = new s;是編譯不 通過的。因?yàn)?,編譯器不知道類中的 property 的名字。例如 string c =
16、 d;var d = new c; 則是可以通過編譯的。編譯器會(huì)創(chuàng)建一個(gè)叫 做類帶有叫 c 的 property。例如下例:new c,ContactName,c.Phone;ContactName 和 Phone 都是在文件中定義與表類,這個(gè) 類有中字 段相對應(yīng)的 property。編譯器數(shù)據(jù)并創(chuàng)建對象時(shí),會(huì)創(chuàng)建一個(gè)兩個(gè)屬性,為 ContactName 和 Phone,然后根據(jù)數(shù)據(jù)初始化對象。另外編譯器 還可以重命名 property 的名字。var q =from c in db.Customersselect new c.ContactName, c.Phone;上 面語句描述:使用 S
17、ELECT 和類型返回僅含客戶聯(lián)系人和號(hào)碼的序 列var q =from e in db.Employees select newName = e.Name + + e.LastName,Phone = e.HomePhone;上面 語句描述:使用 SELECT 和類型返回僅含雇員和號(hào)碼的序列,并將Name 和 LastName 字段合并為一個(gè)字段“Name”,此外在所得的 序列中將 HomePhone字段重命名為Phone。var q =from p in db.Products select newp.ProductID,HalfPrice = p.UnitPrice / 2;上面語句描述
18、:使用 SELECT 和除以 2 所得的值)的序列。類型返回所有產(chǎn)品的 ID 以及 HalfPrice(設(shè)置為產(chǎn)品單價(jià)3.條件形式:說 明:生成 SQL 語句為: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;語句描述:使用嵌套查詢返回所有訂單及其 OrderID 的序列 、打折訂單中項(xiàng)目的子序列以及免
19、送貨所省下的金額。8.本地方法調(diào)用 形式(LocalMethodCall):這個(gè)例子在查詢中調(diào)用本地方法 PhoneNumberConverter 將號(hào)碼轉(zhuǎn)換為國際格式。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)換為國際格式并創(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 形式:說明:篩選字段中不相同的值 。用于查詢不重復(fù)的結(jié)果集。生成 SQL 語句為:SELECT DISTINCTCity FROM Customersvar q = (from c in db
22、.Customers select c.City ).Distinct();語句描述:查詢顧 客覆蓋的國家。語句之LINQtoSQL(3)Count/Sum/Max/Avg1 Count/Sum 講解2 Min 講解3 Max 講解4 Average 和 Aggregate 講解Count/Sum/Max/Avg 操作符適用場景: 統(tǒng)計(jì)數(shù)據(jù)吧,比如統(tǒng)計(jì)一些數(shù)據(jù)的個(gè)數(shù),求和,最小值,最大值,平均數(shù)。Count說明:返回集合中的元素個(gè)數(shù),返回FROM類型;不延遲。生成 SQL 語句為:SELECT COUNT(*)1.簡單形式:得到數(shù)據(jù)庫中客戶 的數(shù)量:var q = db.Customers.C
23、ount();2.帶條件形 式:得到數(shù)據(jù)庫中未斷貨產(chǎn)品的數(shù)量:var q = db.Products.Count(p = !p.Discontinued);LongCount說明 :返回集合中的元素個(gè)數(shù),返回 LONG 類型;不延遲。對于元素個(gè)數(shù)較多的集合可 視情況可以選用 LongCount 來統(tǒng)計(jì)元素個(gè)數(shù),它返回 long 類型,比較精確。生成 SQL 語句為: SELECT COUNT_BIG(*) FROMvar q = db.Customers.LongCount();Sum說明:返回集合中數(shù)值類型元SELECT SUM() FROM和,集合應(yīng)為類型集合;不延遲。生成 SQL 語句為
24、:1.簡單形式:得到所有訂單的總運(yùn)費(fèi):var q = db.Orderect(o = o.Freight).Sum();形式:2.得 到所有產(chǎn)品的訂貨總數(shù):var q = db.ProductMinm(p = p.UnitsOnOrder);說明:返回集合中元素的最小值;不延遲。 生成 SQL 語句為:SELECT MIN() FROM 1.簡單形式:查找任 意產(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說明:返回集合中元素的最大值;不延 遲。生成 SQL 語句為:SELECT MAX() FROM1.簡單形式:查 找任意雇員的最近雇用日期:var q = db.Employeeect(e = e.HireDate).M
26、ax();形式:2.查找任意產(chǎn)品的最大庫存量: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說明:返回集合中的數(shù)值類型元素的平均值。集合應(yīng)為數(shù)字類型集合,其返
27、回double;不延遲。生成 SQL 語句為:SELECT AVG() FROM值類型為1.簡單形式:得到所有訂單的平均運(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說明:根據(jù)輸入的表達(dá)式獲取聚合值;不延遲。即 是說:用一個(gè)值與當(dāng)前元素通過指定的函數(shù)來進(jìn)行對比來遍歷集合中的元素 ,符合條件的元素保留下來。如果沒有指定值的話,值默認(rèn)為集合的第 一個(gè)元素。LINQ to SQL 語句(4)之 JoinJoin 操作符適用場景:在表關(guān)系中有一對一關(guān)系,一對多關(guān)系, 多對多關(guān)系等。對各個(gè)表之間的關(guān)系,就用這些實(shí)現(xiàn)對多個(gè)表的操作。說明:在 Join 操作中,分別為 Join(Join 查詢), SelectMan
29、y(Select 一對多選擇) 和GroupJoin(分組 Join 查詢)。該擴(kuò)展方法對兩個(gè)序列中鍵匹配的元素進(jìn) 行 inner join 操作SelectMany說明:在寫查詢語句時(shí),如果 被翻譯成 SelectMany 需要滿足 2 個(gè)條件。1:查詢語句中沒有 join 和o,2:必 須出現(xiàn) EntitySet。在表關(guān)系中有一對一關(guān)系,一對多關(guān)系,多對多關(guān)系等 ,下面分別介紹一下。1.一對多關(guān)系(1 to Many):var q =from c in db.Customers from o in c.Orderswhere c.City = Londonselect o;語句描述:Cus
30、tomers 與 Orders 是一對多關(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語句描述:這一句使用了 p.r.Country 條件,間接關(guān)聯(lián)了r 表。這個(gè)例子在 Where子句中使 用外鍵導(dǎo)航篩選其供應(yīng)商在且缺貨的產(chǎn)品。生成 SQL 語句
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.多對多關(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;說明:多對多關(guān)系一般會(huì)涉及三個(gè)表(如果有一個(gè)表是自關(guān)聯(lián)的,那有可能只有 2 個(gè)表)。這一句語句涉及 Employee
33、s, EmployeeTerritories, Territories 三個(gè)表。它們的關(guān)系是 1:M:1。 Employees 和 Territories 沒有很明確的關(guān)系。語句描述:這個(gè)例子在 From 子句中使 用外鍵導(dǎo)航篩選在西雅圖的雇員,同時(shí)列出其所在地區(qū)。這條生成SQL 語句為: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,語句描述:這個(gè)例子在 select 子句中使用外鍵導(dǎo)航篩選成 對的雇員,每對中一個(gè)雇員隸屬于另一個(gè)雇員,且兩個(gè)雇員都來自相同城市。生 成 SQL 語句為: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像上面所說的,沒有 join 和o,被翻譯成 SelectMany,同時(shí)有 join 和o 時(shí),那么就被翻譯為 GroupJoin。在這里o 的 概念是對其結(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、();說明:在一對多關(guān)系中,左邊是 1,它每條為 c(from c in db.Customers),右邊是 Many,其每條叫做o ( join o in db.Orders ),每對應(yīng)左邊的一個(gè) c,就會(huì)有一組o,那這一組 o,就叫做 orders, 也就是說,把一組 o 命名為 orders,這就是o 用途。這也就是為什么在 select 語句中,orders 可以調(diào)用聚合函數(shù) Count。在 T-SQL 中,使用其內(nèi)嵌的 T- SQL 返回值作為字。:生成 SQL 語句為: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 語句為: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):此示例說明如何通過使用 此示例說明如何通過使用雇員沒有訂單時(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;說明:以 Employees 左表,Orders 右表,Orders 表中為空時(shí), 用 null 值填充。Join 的結(jié)果重命名 ords,使用 DefaultIfEmpty()函數(shù)對其再次查 詢。其
41、最后的結(jié)果中有個(gè) Order,因?yàn)?from o in ords.DefaultIfEmpty() 是對 ords 組再一次遍歷,所以,最后結(jié)果中的 Order 并不是一個(gè)集合。但是,如果沒 有from o in ords.DefaultIfEmpty() 這句,最后的select 語句寫成select new e. Name, e.LastName, Order = ords 的話,那么 Order 就是一個(gè)集合。4.投影的 Let 賦值(Projected let assignment):說明:let 語句 是重命名。let 位于第一個(gè) from 和 select 語句之間。這個(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;說明:使用三個(gè)表,并且用類來說明:使用三個(gè)表,并 且用類來表示它們之間的關(guān)系。它們之間的關(guān)系不能用一個(gè)鍵描述清楚,所 以用類,來表示組合鍵。還有一種是兩個(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 語句(5)之 Order ByOrder By 操作適用場景:對查詢出的語句進(jìn)行排序,比如按時(shí)間排序 等等。說明:按指定表達(dá)式對集合排序;延遲,:按指定表達(dá)式對集合 排序;延遲,默認(rèn)是升序,加上 descending 表示降序,對應(yīng)的擴(kuò)展方法是 OrderBy
45、 和 OrderByDescending1.簡單形式這個(gè)例子使用 orderby 按雇用日期對雇員進(jìn)行排序:var q =from e in db.Employees orderby e.HireDate select e;說明:默認(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;語句描述:使用where 和orderby 按運(yùn)費(fèi)進(jìn)行排序。
46、3.降序排序var q =from p in db.Productsorderby p.UnitPrice descending select p;4.ThenBy語句描述:使用復(fù)合的 orderby 對客戶進(jìn)行排序,進(jìn)行排序:var q =from c in db.Customers orderby c.City, c.ContactName select c;說明:按多個(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 中沒有 ThenBy 語句,其依然翻譯為OrderBy,所以也可以用下面語句來表達(dá):var q =db.Customers.OrderBy(c = c.ContactName).OrderBy(c = c.City).ToList ();所要注意的是,多個(gè) OrderBy 操作時(shí),級(jí)連方式是按逆序。對 于降序的,用相應(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)生的對象的類別必須為C#語言的基本類型。比如下句,這里 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;語句描述:使用 orderby 先按發(fā) 往國家再按運(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;語句描述:使用 orderby、Max 和 Group By 得出每種類別
51、中單價(jià)最高的產(chǎn)品,并按CategoryID 對這組產(chǎn)品進(jìn)行排序。LINQ to SQL 語句(6)之 Group By/HavingGroup By/Having 操作符適用場景:分組數(shù)據(jù),為查找數(shù)據(jù)縮小 范圍。說明:分配并返回對傳入?yún)?shù)進(jìn)行分組操作后的可枚舉對象。分 組;延遲1.簡單形式:var q =from p in db.Products group p by p.CategoryID select g;o g語句描述:使用Group By 按 CategoryID 劃分產(chǎn)品。說 明:from p in db.Products 表示從表中將產(chǎn)品對象取出來。group p by p.Ca
52、tegoryIDo g表示對 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 ;說明:在這句 LINQ 語句中,有 2 個(gè) property:CategoryID 和 g。這個(gè)類,其實(shí)質(zhì)是對返回結(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);語句描述:使用Group By 和 Max 查找每個(gè) CategoryID 的最高單價(jià)。說明:先按 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);語句描述:使用Group By 和 Min 查找每個(gè) CategoryID 的最低 單價(jià)。說明:先按 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);語句描述:使用Group By 和 Average 得到每個(gè) CategoryID 的
56、平均單價(jià)。說明:先按 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);語句描述:使用Group By 和 Sum 得到 每個(gè) CategoryID 的單價(jià)總計(jì)。說明:先按 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();語句描述:使用Group By 和 Count 得到每 個(gè) CategoryID 中產(chǎn)品的數(shù)量。說明:先按 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);語句描述:使 用Group By 和 Co
58、unt 得到每個(gè) CategoryID 中斷貨產(chǎn)品的數(shù)量。說明:先按 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();語句描述:根據(jù)產(chǎn) 品的ID 分組,查詢產(chǎn)品數(shù)量大于 10 的 I
59、D 和產(chǎn)品數(shù)量。這個(gè)示例在 Group By 子句 后使用 Where 子句查找所有至少有 10 種產(chǎn)品的類別。說明:在翻譯成SQL 語句時(shí),在最外層嵌套了 Where 條件。10.多列(Multiple Columns)var categories =from p in db.Products group p by newp.CategoryID,p.rIDo gselect newg.Key, g;語句描述:使用Group By 按 CategoryID 和rID 將產(chǎn)品分組。說明:既按產(chǎn)品的分類,又按供應(yīng)商分類。在by 后面,new 出來一個(gè)類。這里,Keyg.Key.CategoryI
60、D其實(shí)質(zhì)是一個(gè)類的對象,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語句描述 :使用 Group By 返回兩個(gè)產(chǎn)品序列。第一個(gè)序列包含單價(jià)大于 10 的產(chǎn)品。第二個(gè) 序列包含單價(jià)小于或等于 10 的產(chǎn)品。說明:按產(chǎn)品單價(jià)是否大于 10 分類 。其結(jié)果分為兩類,大于的是一類,小于及等于為另一類。語句之LINQtoSQL(7)E
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中校級(jí)課題申報(bào)書
- 發(fā)票供銷合同范本
- 南匯家電運(yùn)輸合同范本
- 保時(shí)捷合同范本
- 網(wǎng)球課題申報(bào)書格式要求
- 公司交保險(xiǎn)合同范本
- 全國合同范本模板
- 合同范本是幾號(hào)字體
- 買賣小型合同范本
- 中介簽獨(dú)家合同范本
- 2024年無錫商業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- Q-GDW1799.2-2013-電力安全工作規(guī)程-線路部分
- (2024版)肉、禽、蛋、奶及水產(chǎn)品零售行業(yè)綜合知識(shí)
- IBM咨詢-中糧生化ERP項(xiàng)目業(yè)務(wù)藍(lán)圖設(shè)計(jì)報(bào)告
- 海外利益安全
- 交通安全宣傳意義
- 智慧農(nóng)業(yè)的智能農(nóng)機(jī)與裝備
- 并聯(lián)有源電力濾波器工程應(yīng)用關(guān)鍵技術(shù)的研究的開題報(bào)告
- 跨文化語境下的國家形象塑造與傳播以中國《國家形象》宣傳片為例
- 志愿服務(wù)與志愿者精神知識(shí)考試題庫大全(含答案)
- 工業(yè)機(jī)器人應(yīng)用基礎(chǔ) 教案(教學(xué)設(shè)計(jì)) 模塊二-任務(wù)二-ABB工業(yè)機(jī)器人編程基礎(chǔ)
評(píng)論
0/150
提交評(píng)論