日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LINQ体验(6)——LINQ语句之Join和Order By

發布時間:2024/9/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LINQ体验(6)——LINQ语句之Join和Order By 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Join操作

適用場景:在我們表關系中有一對一關系,一對多關系,多對多關系等。對各個表之間的關系,就用這些實現對多個表的操作。

說明:在Join操作中,分別為Join(Join查詢), SelectMany(Select一對多選擇)和GroupJoin(分組Join查詢)。
該擴展方法對兩個序列中鍵匹配的元素進行inner join操作

SelectMany

說明:我們在寫查詢語句時,如果被翻譯成SelectMany需要滿足2個條件。1:查詢語句中沒有join和into,2:必須出現EntitySet。在我們表關系中有一對一關系,一對多關系,多對多關系等,下面分別介紹一下。

1.1 to Many關系:

var q =??? from c in db.Customers??? from o in c.Orders??? where c.City == "London"??? select o;

語句描述:Customers與Orders是一對多關系。即Orders在Customers類中以EntitySet形式出現。所以第二個from是從c.Orders而不是db.Orders里進行篩選。

var q =??? from p in db.Products??? where p.Supplier.Country == "USA" && p.UnitsInStock == 0??? select p;

語句描述:這一句使用了p.Supplier.Country條件,間接關聯了Supplier表。生成SQL語句為:

SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID],[t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder],[t0].[ReorderLevel], [t0].[Discontinued]FROM [dbo].[Products] AS [t0]LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID]WHERE ([t1].[Country] = @p0) AND ([t0].[UnitsInStock] = @p1)-- @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [USA]-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0]

2.Many to Many關系:

var q =??? from e in db.Employees??? from et in e.EmployeeTerritories??? where e.City == "Seattle"??? select new {e.FirstName, e.LastName, et.Territory.TerritoryDescription};

說明:多對多關系一般會涉及三個表(如果有一個表是自關聯的,那有可能只有2個表)。這一句語句涉及Employees, EmployeeTerritories, Territories三個表。它們的關系是1:M:1。Employees和Territories沒有很明確的關系。

語句描述:這條生成SQL語句為:
SELECT [t0].[FirstName], [t0].[LastName], [t2].[TerritoryDescription]
FROM [dbo].[Employees] AS [t0]
CROSS JOIN [dbo].[EmployeeTerritories] AS [t1]
INNER JOIN [dbo].[Territories] AS [t2] ON [t2].[TerritoryID] = [t1].[TerritoryID]
WHERE ([t0].[City] = @p0) AND ([t1].[EmployeeID] = [t0].[EmployeeID])
-- @p0: Input NVarChar (Size = 7; Prec = 0; Scale = 0) [Seattle]

3.自關聯關系:

var q =??? from e1 in db.Employees??? from e2 in e1.Employees??? where e1.City == e2.City??? select new {??????? FirstName1 = e1.FirstName, LastName1 = e1.LastName,??????? FirstName2 = e2.FirstName, LastName2 = e2.LastName,??????? e1.City??? };

生成SQL語句為:
SELECT [t0].[FirstName] AS [FirstName1], [t0].[LastName] AS [LastName1], [t1].[FirstName] AS [FirstName2], [t1].[LastName] AS [LastName2], [t0].[City]
FROM [dbo].[Employees] AS [t0], [dbo].[Employees] AS [t1]
WHERE ([t0].[City] = [t1].[City]) AND ([t1].[ReportsTo] = [t0].[EmployeeID])

GroupJoin

像上面所說的,沒有join和into,被翻譯成SelectMany,同時有join和into時,那么就被翻譯為GroupJoin。在這里into的概念是對其結果進行重新命名。

1.Two way join(兩個表聯合查詢)

var q =??? from c in db.Customers??? join o in db.Orders on c.CustomerID equals o.CustomerID into orders??? select new {c.ContactName, OrderCount = orders.Count()};

說明:在一對多關系中,左邊是1,它每條記錄為c(from c in db.Customers),右邊是Many,其每條記錄叫做o ( join o in db.Orders ),每對應左邊的一個c,就會有一組o,那這一組o,就叫做orders,也就是說,我們把一組o命名為orders,這就是into用途。這也就是為什么在select語句中,orders可以調用聚合函數Count。在T-SQL中,使用其內嵌的T-SQL返回值作為字段值。如圖所示:

生成SQL語句為:
SELECT [t0].[ContactName], (
??? SELECT COUNT(*)
??? FROM [dbo].[Orders] AS [t1]
??? WHERE [t0].[CustomerID] = [t1].[CustomerID]
) AS [OrderCount]
FROM [dbo].[Customers] AS [t0]

2.There way join(三個表聯合查詢)

var q =??? from c in db.Customers??? join o in db.Orders on c.CustomerID equals o.CustomerID into ords??? join e in db.Employees on c.City equals e.City into emps??? select new {c.ContactName, ords=ords.Count(), emps=emps.Count()};

生成SQL語句為:
SELECT [t0].[ContactName], (
SELECT COUNT(*)
FROM [dbo].[Orders] AS [t1]
WHERE [t0].[CustomerID] = [t1].[CustomerID]
) AS [ords], (
SELECT COUNT(*)
FROM [dbo].[Employees] AS [t2]
WHERE [t0].[City] = [t2].[City]
) AS [emps]
FROM [dbo].[Customers] AS [t0]

3.Left Outer Join

var q =??? from e in db.Employees??? join o in db.Orders on e equals o.Employee into ords??? from o in ords.DefaultIfEmpty()??? select new {e.FirstName, e.LastName, Order = o};

說明:以Employees左表,Orders右表,Orders 表中為空時,用null值填充。Join的結果重命名ords,使用DefaultIfEmpty()函數對其再次查詢。其最后的結果中有個Order,因為from o in ords.DefaultIfEmpty() 是對ords組再一次遍歷,所以,最后結果中的Order并不是一個集合。但是,如果沒有from o in ords.DefaultIfEmpty() 這句,最后的select語句寫成select new { e.FirstName, e.LastName, Order = ords }的話,那么Order就是一個集合。

4.Projected let assignment

說明:let語句是重命名。let位于第一個from和select語句之間。

var q =??? from c in db.Customers??? join o in db.Orders on c.CustomerID equals o.CustomerID into ords??? let z = c.City + c.Country??? from o in ords??? select new {c.ContactName, o.OrderID, z};

5.Composite Key(組合鍵)

var q =??? from o in db.Orders??? from p in db.Products??? join d in db.OrderDetails??????? on new {o.OrderID, p.ProductID} equals new {d.OrderID, d.ProductID}??????? into details??? from d in details??? select new {o.OrderID, p.ProductID, d.UnitPrice};

說明:使用三個表,并且用匿名類來表示它們之間的關系。它們之間的關系不能用一個鍵描述清楚,所以用匿名類,來表示組合鍵。還有一種是兩個表之間是用組合鍵表示關系的,不需要使用匿名類。

6.Nullable/Nonnullable Key Relationship

var q =??? from o in db.Orders??? join e in db.Employees??????? on o.EmployeeID equals (int?)e.EmployeeID into emps??? from e in emps??? select new {o.OrderID, e.FirstName};

Order By操作

適用場景:對查詢出的語句進行排序,比如按時間排序等等。

說明:按指定表達式對集合排序;延遲,默認是升序,加上descending表示降序,對應的擴展方法是OrderBy和OrderByDescending

1.簡單形式

說明:默認為升序

var q =??? from e in db.Employees??? orderby e.HireDate??? select e;

2.帶條件形式

注意:Where和Order By的順序并不重要。而在T-SQL中,Where和Order By有嚴格的位置限制。

var q =??? from o in db.Orders??? where o.ShipCity == "London"??? orderby o.Freight??? select o;

3.降序排序

var q =??? from p in db.Products??? orderby p.UnitPrice descending??? select p;

4.ThenBy

說明:按多個表達式進行排序,例如先按City排序,當City相同時,按ContactName排序。

var q =??? from c in db.Customers??? orderby c.City, c.ContactName??? select c;

說明:這一句用Lambda表達式像這樣寫:

var q = db.Customers.OrderBy(c => c.City).ThenBy(c => c.ContactName).ToList();

在T-SQL中沒有ThenBy語句,其依然翻譯為OrderBy,所以也可以用下面語句來表達:

var q = db.Customers.OrderBy(c => c.ContactName).OrderBy(c => c.City).ToList();

所要注意的是,多個OrderBy操作時,級連方式是按逆序。對于降序的,用相應的降序操作符替換即可。

var q = db.Customers.OrderByDescending(c => c.City).ThenByDescending(c => c.ContactName).ToList();

需要說明的是,OrderBy操作,不支持按type排序,也不支持匿名類。比如

var q = db.Customers.OrderBy(c => new {c.City,c.ContactName}).ToList();

會被拋出異常。錯誤是前面的操作有匿名類,再跟OrderBy時,比較的是類別。比如

var q = db.Customers.Select(c => new { c.City, c.Address }).OrderBy(c => c).ToList();

如果你想使用OrderBy(c => c),其前提條件是,前面步驟中,所產生的對象的類別必須為C#語言的基本類型。比如下句,這里City為string類型。

var q = db.Customers.Select(c=>c.City).OrderBy(c => c).ToList();

5.ThenByDescending

這兩個擴展方式都是用在OrderBy/OrderByDescending之后的,第一個ThenBy/ThenByDescending擴展方法作為第二位排序依據,第二個ThenBy/ThenByDescending則作為第三位排序依據,以此類推

var q =??? from o in db.Orders??? where o.EmployeeID == 1??? orderby o.ShipCountry, o.Freight descending??? select o;

6.帶GroupBy形式

var categories =??? from p in db.Products??? group p by p.CategoryID into g??? orderby g.Key??? select new {??????? g.Key,??????? MostExpensiveProducts =??????????? from p2 in g??????????? where p2.UnitPrice == g.Max(p3 => p3.UnitPrice)??????????? select p2??? }; 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的LINQ体验(6)——LINQ语句之Join和Order By的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产无套视频 | 精品国产九九 | 成人免费看片视频 | 91麻豆精品国产91久久久久久久久 | 中文字幕永久视频 | 欧美一级射 | 久国久产久精永久网页 | 91毛片网站| 91啦丨九色丨刺激 | wwwjavhd| 最新版天堂资源在线 | 国产午夜成人久久无码一区二区 | 女人床技48动态图 | 午夜播放| 午夜视频一区二区 | 老鸭窝视频在线观看 | 国产特级片 | 国产精品无码专区av在线播放 | 美女光屁股视频 | 精品成人久久久 | 亚洲狼人综合网 | 久久二| 成人一级影片 | 2023毛片 | 美女裸片 | 久久天天东北熟女毛茸茸 | jk美女又爽又黄视频 | 国产美女一区二区 | 奶水喷溅 在线播放 | 91麻豆一区二区三区 | 亚洲精品在线网站 | 日本男女网站 | 国产精品v欧美精品v日韩 | 亚洲综合在线中文字幕 | 日本老年老熟无码 | 男女无遮挡网站 | 日本中文字幕在线播放 | 美女让男人捅 | aaaa黄色 | 亚洲精品www久久久久久 | 精品国产精品国产偷麻豆 | 亚洲男人的天堂在线 | 欧洲av片 | av一卡二卡| 日日狠狠久久偷偷四色综合免费 | 日本一区二区免费电影 | av一级 | 91岛国| 天天射寡妇射 | 黄色一级二级 | 国产h自拍 | 成人在线直播 | 国产又粗又长 | 国产成人麻豆精品午夜在线 | 8mav在线| 欧美a网站 | 天天天干 | 久久一热 | 欧美成人a∨高清免费观看 国产精品999视频 | 国产精品美女一区二区三区 | 一级看片免费视频 | 欧美私人影院 | 三区在线| 中文字幕Av日韩精品 | 国产天堂在线 | 阿的白色内裤hd中文 | 国产精品制服丝袜 | 日韩国产欧美 | 日日噜噜夜夜狠狠久久丁香五月 | 亚洲网在线 | 黑人添美女bbb添高潮了 | 亚洲国产成人在线视频 | 伊人春色视频 | 91亚洲一线产区二线产区 | 97se在线视频 | 免费av福利 | 香蕉视频一区二区三区 | 日韩一级片网址 | 香港三级韩国三级日本三级 | 日本吃奶摸下激烈网站动漫 | 主播av在线 | 精品www久久久久久奶水 | 综合激情四射 | 国产高清亚洲 | 日本一区免费电影 | 男人的天堂在线 | 97国产精东麻豆人妻电影 | 正在播放亚洲 | 丰满秘书被猛烈进入高清播放在 | 91av在线免费观看 | 妓院一钑片免看黄大片 | 中国色视频 | 亚州中文| 色av导航| 国产伦精品一区二区三区四区 | 偷拍第1页 | 午夜私人福利 | 国产偷人妻精品一区 | 一区二区三区免费高清视频 |