程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# 3.0入門系列(十)-之Join操作(1)

C# 3.0入門系列(十)-之Join操作(1)

編輯:關於C語言

本節講join操作。我們知道,T-sql中,有三種最基本的join,inner join, left join, 和right join。 而dlinq並不支持right join。道理很簡單,right join以right表為基礎,left表中沒有對應記錄的,將以null值填充。而dlinq以left表做為主表創建對象。如果一個對象為null,你如何獲取它的其他的屬性呢?

在C# 3.0入門系列(四)-之Select操作一文中,我們提到了query expression首先會被翻譯成標准的API, 而dlinq在join操作中,一共為我們提供了三個API.它們是Join, SelectMany和GroupJoin

Join

在101 的sample中,並沒有join的例子。當一個query expression 有join字句時,而沒有into字句,它將會被翻譯成join方法。如,以Customers為主表,Orders為子表,用CustomerID 做關聯進行join操作。

var q =
from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID

select new { c.CustomerID, o.EmployeeID };

它將會被翻譯成

var q = db.Customers.Join(db.Orders, c => c.CustomerID, o => o.CustomerID, (c, o) => new { c.CustomerID, o.EmployeeID });

join方法的第一個參數,為子表,第二個參數,表示主表中的選擇鍵,第三個參數為子表中的對應鍵,第四個為最終篩選結果。大家需要注意的時,因為參數的順序是確定的,所以在寫dlinq語句時,c.CustomerID equals o.CustomerID 的順序是不能變的。

該語句所產生的T-sql語句為

SELECT [t0].[CustomerID], [t1].[EmployeeID]
FROM [Customers] AS [t0]
INNER JOIN [Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]

SelectMany

在101sample中,給了4個SelectMany的例子。會被翻譯成SelectMany需要滿足2個條件。1,query語句中沒有join和into,2,必須出現EntitySet。 關於EntitySet,請參考C#3.0進階系列(一)-從映射講起

先看第一個例子

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

Customers與Orders是1:M的關系。即Orders在Customers類中,以EntitySet出現。所以第二個from是從c.Orders而不是db.Orders裡進行篩選。定義了他們關系的Mapping Code用Attribute保存了他們的關系。如

[Association(Name="Order_OrderDetail", Storage="_OrderDetails", OtherKey="OrderID")]
[Association(Name="Order_OrderDetail", Storage="_Order", ThisKey="OrderID", IsForeignKey=true)]

所以,你就不用擔心,dlinq是否知道該按那個鍵進行關聯。有興趣的朋友,可以自己修改這裡的OtherKey和ThisKey的值,看看翻譯的T-sql語句是否變了。

第二個例子

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

這個例子,直接就使用了p.Supplier.Country 做條件,這樣,也間接關聯了SupplIEr表。該語句生成的T-sql語句更是值得揣摩,這大概是Left Out Join 的最簡單的Dlinq語句。

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 String (Size = 3; Prec = 0; Scale = 0) [USA]
-- @p1: Input Int32 (Size = 0; Prec = 0; Scale = 0) [0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved