2010-05-14 3 views
2

누군가 linq가 엔티티에 항상 왼쪽 외부 조인을 생성하는 것처럼 보이는 이유를 아는 사람이 있는지 궁금합니다. 나는 선택적인 관계에서 그것을 이해할 것이지만 관계가 필수 일 때 그것은 좋은 말이되지 않습니다.왜 Linq to Entities는 외부 외부 조인을 생성합니까?

내부 조인을 생성하는 방법을 알고있는 사람이 있습니까? 당신은 내부 만들 수 있습니다

+0

거짓 전제 : 여기

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

그리고

는 LINQ 쿼리가 생성되는 SQL 예를 들어, 여기에 AdventureWorks 데이터베이스에 대한 쿼리입니다. L2E *는 종종 LEFT가 필요한 무언가를하지 않을 때 INNER JOIN을 사용합니다. 특정 검색어 예제는 귀하가보고있는 것을 설명하는 데 도움이됩니다. –

답변

0

조인. join 키워드 만 사용하면됩니다.

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 
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는 'join'과 [일반적으로 L2E에서 join을 사용하는 것이 잘못되었습니다] (http://blogs.teamb.com/craigstuntz/2010/01/13/38525/)를 사용하지 않고 INNER JOIN을 쉽게 사용할 수 있습니다. –

+0

@Craig Stuntz - 당신의 논문은 왜 L2S 나 L2E에서 구문 결합 선호를 뛰어 넘어서'join '을 사용해서는 안되는 지에 대한 매력적인 논쟁을 제공하지 않습니다. 중요한 성능 차이가 있습니까? 'join' 구문으로 작성할 수없는 일련의 쿼리가 있습니까? 하나가 좀 더 장황 할 수있는 유일한 이유는 무엇입니까? – Thomas

+0

나는 이것에 관해 꽤 분명하다고 생각했다.'join '을 사용하는 것은 그것을 사용하지 않는 것과 똑같은 일을한다. 단 두번의 타이핑과 가독성과 유지 보수성의 절반을 제외한다. 항해가 사용될 수있는 경우에는 이점이 없습니다. –

관련 문제