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

C# 3.0 入門系列(十):Join 基礎與 SelectMany——1:M、M:M、自關聯與 GroupJoin 核心機制

     編輯:關於C語言

SelectMany:利用導覽屬性隱式 Join

當查詢語法無 join/into且出現 EntitySet 導覽屬性時,編譯器轉譯為 SelectMany。

1:M 關聯:Customers → Orders

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"。
  • 無需顯式指定 Join 鍵,LINQ 依映射自動推斷。

隱式關聯:透過 Supplier 導覽屬性篩選

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 寫法。

M:M 關聯:Employees ↔ Territories(中介表 EmployeeTerritories)

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 導覽屬性。
  • 轉譯 SQL 使用 CROSS JOIN + INNER JOIN。

自關聯:Employees 經理-下屬關係

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。

GroupJoin 核心:join ... into 的分群語意

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:M 關聯中,左側每筆 c 對應一組 orders。
  • into orders 將該組重新命名,使其在 select 可呼叫 Count() 等彙總方法。
  • 轉譯 SQL 使用子查詢標量計數,效能極佳:
SELECT [t0].[ContactName], (
    SELECT COUNT(*) FROM [dbo].[Orders] AS [t1]
    WHERE [t0].[CustomerID] = [t1].[CustomerID]
) AS [value] FROM [dbo].[Customers] AS [t0]

GroupJoin 概念圖

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