當查詢語法無 join/into且出現 EntitySet 導覽屬性時,編譯器轉譯為 SelectMany。
var q = from c in db.Customers
from o in c.Orders
where c.City == "London"
select o;
c.Orders 為 EntitySet<Order>,映射代碼中以 Association 屬性定義 OtherKey="OrderID"。var q = from p in db.Products
where p.Supplier.Country == "USA" && p.UnitsInStock == 0
select p;
直接使用 p.Supplier.Country 觸發 Left Outer Join,轉譯 SQL:
SELECT [t0].* FROM [dbo].[Products] AS [t0]
LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID]
WHERE [t1].[Country] = 'USA' AND [t0].[UnitsInStock] = 0
這是 LINQ to SQL 最簡潔的 Left Outer Join 寫法。
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 };
Employees、EmployeeTerritories、Territories。1 : M : 1,Select 中直接存取 et.Territory 導覽屬性。CROSS JOIN + INNER JOIN。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 };
同一實體集合自我關聯,where 中隱式 Join 條件 e1.City == e2.City,映射中 ReportsTo 對應 EmployeeID。轉譯 SQL 為自我 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() };
c 對應一組 orders。into orders 將該組重新命名,使其在 select 可呼叫 Count() 等彙總方法。SELECT [t0].[ContactName], (
SELECT COUNT(*) FROM [dbo].[Orders] AS [t1]
WHERE [t0].[CustomerID] = [t1].[CustomerID]
) AS [value] FROM [dbo].[Customers] AS [t0]
