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,分別產生訂單群組與員工群組,最後投影計算各群組筆數。
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]
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 緊後以提高可讀性。