2010-11-09 3 views
1

J'ai la requête suivante de la AdventureWorks DBLinq Question - Pourquoi une jointure externe est-elle utilisée ici?

from customer in Customer 
where customer.CustomerID == 20042 
select new { 
customer.AccountNumber, 
Order = from order in customer.SalesOrderHeader 
    select new { order } 
} 

Le tableau client a 1: relation M à SalesOrderHeader. Le T-SQL résultant fait une jointure externe gauche sur la table SalesOrderHeader. Quelqu'un peut-il me dire pourquoi? Et, si je voulais une jointure interne à la place. Comment changerais-je cette requête?

Répondre

1

Si vous souhaitez rejoindre intérieur, utilisez ceci:

from customer in Customer 
where customer.CustomerID == 20042 
from order in customer.SalesOrderHeaders 
select new { customer.AccountNumber, Order = order } 

Si vous voulez simplement veulent filtrer les clients qui ne disposent pas SalesOrderHeaders, utilisez ceci:

from customer in Customer 
where customer.CustomerID == 20042 
where customer.SalesOrderHeaders.Any() 
select new { 
customer.AccountNumber, 
Order = 
    from order in customer.SalesOrderHeaders 
    select order 
} 
1

Même s'il s'agit d'un-à-plusieurs, vous devez tout de même permettre qu'il soit unique. C'est, le client peut avoir aucune commande. Si vous ne faites pas de jointure externe, vous ne recevrez aucun enregistrement si ce client particulier n'a pas de commandes.

+0

Je pense que vous avez manqué la point de ma question (s). Pourquoi L2S choisit-il automatiquement de faire une jointure externe gauche et comment ma requête change-t-elle si je veux une jointure interne à la place (où aucun enregistrement ne peut être renvoyé)? –

Questions connexes