2010-05-14 2 views
2

Je me demandais si quelqu'un savait pourquoi linq aux entités semble toujours générer des jointures externes à gauche. Je le comprendrais sur une relation optionnelle mais cela n'a pas de bon sens quand la relation est obligatoire.Pourquoi Linq to Entities génère-t-il des jointures externes gauches?

Est-ce que quelqu'un a une idée de la façon de générer des jointures internes à la place?

+0

fausse prémisse. L2E * souvent * utilise INNER JOINs, lorsque vous ne faites pas quelque chose qui (pour des raisons peut-être non évidentes) nécessite LEFT. Des exemples de requête spécifiques seraient utiles pour expliquer ce que vous voyez. –

Répondre

0

Vous pouvez créer des jointures internes. Vous devez simplement utiliser le mot-clé join. Par exemple, voici une requête sur la base de données 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 }; 

L'équivalent SQL:

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

Et voici le SQL que la requête LINQ produit:

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

Vous pouvez facilement faire en sorte que l'EF utilise INNER JOINs sans utiliser 'join' et [il est généralement incorrect d'utiliser join in L2E] (http://blogs.teamb.com/craigstuntz/2010/01/13/38525/). –

+0

@Craig Stuntz - Votre article ne fournit pas un argument convaincant pour expliquer pourquoi 'join 'ne devrait pas être utilisé au-delà de la préférence syntaxique dans L2S ou L2E. Y a-t-il une différence de performance significative? Y at-il une série de requêtes qui ne peuvent pas être écrites avec la syntaxe 'join'? Est-ce que la seule raison pour laquelle on peut être un peu plus verbeux? – Thomas

+0

Je pensais que j'étais assez clair à ce sujet: Utiliser 'join' fait la même chose que de ne pas l'utiliser, sauf avec deux fois le typage et la moitié de la lisibilité et la maintenabilité. Il n'a aucun avantage dans les cas où les navigations pourraient être utilisées. –