2010-05-14 47 views
2

我想知道是否有人知道爲什麼linq實體似乎總是產生左外連接。我可以在可選的關係上理解它,但是當關系是強制性的時候它沒有意義。爲什麼Linq to Entities會生成左外連接?

有沒有人有任何想法如何使它生成內部連接?

+0

錯誤的前提。 L2E *經常*使用INNER JOIN,當你沒有做某些事情(可能是非顯而易見的原因)需要LEFT。具體的查詢示例將有助於解釋您所看到的內容。 – 2010-05-14 13:17:35

回答

0

您可以創建內部連接。您只需使用join關鍵字。例如,下面是針對AdventureWorks數據庫的查詢:

var query = from od in db.SalesOrderHeader 
      join c in db.Customer on od.Customer.CustomerID equals c.CustomerID 
      select new { c.AccountNumber, od.OrderDate }; 

等效SQL:

Select C.AccountNumber, OD.OrderDate 
From Sales.SalesOrderHeader As OD 
    Join Sales.Customer As C 
     On C.CustomerID = OD.CustomerID 

這裏就是LINQ查詢生成的SQL:

SELECT 
1 AS [C1], 
[Extent2].[AccountNumber] AS [AccountNumber], 
[Extent1].[SalesOrderID] AS [SalesOrderID], 
[Extent1].[RevisionNumber] AS [RevisionNumber], 
[Extent1].[OrderDate] AS [OrderDate], 
[Extent1].[DueDate] AS [DueDate], 
[Extent1].[ShipDate] AS [ShipDate], 
[Extent1].[Status] AS [Status], 
[Extent1].[OnlineOrderFlag] AS [OnlineOrderFlag], 
[Extent1].[SalesOrderNumber] AS [SalesOrderNumber], 
[Extent1].[PurchaseOrderNumber] AS [PurchaseOrderNumber], 
[Extent1].[AccountNumber] AS [AccountNumber1], 
[Extent1].[CreditCardApprovalCode] AS [CreditCardApprovalCode], 
[Extent1].[SubTotal] AS [SubTotal], 
[Extent1].[TaxAmt] AS [TaxAmt], 
[Extent1].[Freight] AS [Freight], 
[Extent1].[TotalDue] AS [TotalDue], 
[Extent1].[Comment] AS [Comment], 
[Extent1].[rowguid] AS [rowguid], 
[Extent1].[ModifiedDate] AS [ModifiedDate], 
[Extent1].[BillToAddressID] AS [BillToAddressID], 
[Extent1].[ContactID] AS [ContactID], 
[Extent1].[ShipMethodID] AS [ShipMethodID], 
[Extent1].[CreditCardID] AS [CreditCardID], 
[Extent1].[CurrencyRateID] AS [CurrencyRateID], 
[Extent1].[CustomerID] AS [CustomerID], 
[Extent1].[SalesPersonID] AS [SalesPersonID], 
[Extent1].[TerritoryID] AS [TerritoryID] 
FROM [Sales].[SalesOrderHeader] AS [Extent1] 
INNER JOIN [Sales].[Customer] AS [Extent2] ON ([Extent1].[CustomerID] = [Extent2].[CustomerID]) OR (([Extent1].[CustomerID] IS NULL) AND ([Extent2].[CustomerID] IS NULL)) 
+0

您可以輕鬆地使EF使用INNER JOIN而不使用'join'和[在L2E中使用連接通常是錯誤的](http://blogs.teamb.com/craigstuntz/2010/01/13/38525/)。 – 2010-05-14 13:16:20

+0

@Craig Stuntz - 您的文章沒有提供一個引人注目的論點,爲什麼不應該在L2S或L2E中使用語法偏好以外的'join'。是否有顯着的性能差異?是否有一系列不能用'join'語法編寫的查詢?是唯一的原因,可以更詳細一點? – Thomas 2010-05-14 15:29:30

+0

我認爲我對此非常清楚:使用'join'與不使用它相同,除了兩次打字和一半的可讀性和可維護性。在可以使用導航的情況下,它沒有任何優勢。 – 2010-05-14 16:15:02