首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0 入門系列(十):Join 進階——多重 Join、Left Outer Join、let 子句與 SQL 轉譯差異

     編輯:關於C語言

多重 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() };

連續兩個 join ... into,分別產生訂單群組與員工群組,最後投影計算各群組筆數。

標準 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 };
  • join ... into ords 先做 GroupJoin(群組連接)。
  • from o in ords.DefaultIfEmpty() 再展開群組,無對應資料時產生 null,達到 Left Outer Join 效果。
  • 最終 Order 為單一實體(或 null),而非集合。

轉譯 SQL:

SELECT [t0].[FirstName], [t0].[LastName], [t2].[OrderID], ...
FROM [dbo].[Employees] AS [t0]
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[OrderID], ...
    FROM [dbo].[Orders] AS [t1]
) AS [t2] ON [t0].[EmployeeID] = [t2].[EmployeeID]

let 子句:查詢中引入區域變數

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 };
  • let 類似 into,用於在查詢中定義計算欄位,可在後續子句使用。
  • 位置彈性:放在第一個 from 之後、select 之前皆合法。

三種 let 位置寫法轉譯 SQL 略有不同(子查詢巢狀層級差異),但語意等價。建議統一放在 from 緊後以提高可讀性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved